/** * @license * Copyright 2022 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@tensorflow/tfjs-core'), require('path'), require('fs'), require('worker_threads'), require('perf_hooks'), require('os')) : typeof define === 'function' && define.amd ? define(['exports', '@tensorflow/tfjs-core', 'path', 'fs', 'worker_threads', 'perf_hooks', 'os'], factory) : (global = global || self, factory((global.tf = global.tf || {}, global.tf.wasm = global.tf.wasm || {}), global.tf, global.path, global.fs, global.worker_threads, global.perf_hooks, global.os)); }(this, (function (exports, tfjsCore, path, fs, worker_threads, perf_hooks, os) { 'use strict'; path = path && Object.prototype.hasOwnProperty.call(path, 'default') ? path['default'] : path; fs = fs && Object.prototype.hasOwnProperty.call(fs, 'default') ? fs['default'] : fs; worker_threads = worker_threads && Object.prototype.hasOwnProperty.call(worker_threads, 'default') ? worker_threads['default'] : worker_threads; perf_hooks = perf_hooks && Object.prototype.hasOwnProperty.call(perf_hooks, 'default') ? perf_hooks['default'] : perf_hooks; os = os && Object.prototype.hasOwnProperty.call(os, 'default') ? os['default'] : os; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ // This enum must align with the enum defined in cc/backend.h. var CppDType; (function (CppDType) { CppDType[CppDType["float32"] = 0] = "float32"; CppDType[CppDType["int32"] = 1] = "int32"; CppDType[CppDType["bool"] = 2] = "bool"; CppDType[CppDType["string"] = 3] = "string"; CppDType[CppDType["complex64"] = 4] = "complex64"; })(CppDType || (CppDType = {})); // Must match enum in cc/fusable_activations.h. var FusableActivation; (function (FusableActivation) { FusableActivation[FusableActivation["linear"] = 0] = "linear"; FusableActivation[FusableActivation["relu"] = 1] = "relu"; FusableActivation[FusableActivation["relu6"] = 2] = "relu6"; FusableActivation[FusableActivation["prelu"] = 3] = "prelu"; FusableActivation[FusableActivation["leakyrelu"] = 4] = "leakyrelu"; FusableActivation[FusableActivation["sigmoid"] = 5] = "sigmoid"; FusableActivation[FusableActivation["elu"] = 6] = "elu"; })(FusableActivation || (FusableActivation = {})); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFusedMatMul; function setup(backend) { wasmFusedMatMul = backend.wasm.cwrap(tfjsCore._FusedMatMul, null /* void */, [ 'number', 'array', 'number', 'number', 'array', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number' // out_id ]); } function fusedBatchMatMul(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var a = inputs.a, b = inputs.b, bias = inputs.bias, preluActivationWeights = inputs.preluActivationWeights; if (a.dtype !== 'float32' || b.dtype !== 'float32') { throw new Error("_FusedMatMul for non non-float32 tensors not yet supported."); } var transposeA = attrs.transposeA, transposeB = attrs.transposeB, activation = attrs.activation, leakyreluAlpha = attrs.leakyreluAlpha; var aId = backend.dataIdMap.get(a.dataId).id; var bId = backend.dataIdMap.get(b.dataId).id; var biasId = 0; if (bias != null) { var biasData = backend.dataIdMap.get(bias.dataId); if (biasData.shape.length !== 1) { throw new Error("_FusedMatMul only supports rank-1 bias but got " + ("rank " + biasData.shape.length + ".")); } biasId = biasData.id; } var preluActivationWeightsId = preluActivationWeights == null ? 0 : backend.dataIdMap.get(preluActivationWeights.dataId).id; var fusedActivation = FusableActivation[activation]; if (fusedActivation == null) { throw new Error(activation + " activation not yet supported for FusedConv2D " + "in the wasm backend."); } var leftDim = transposeA ? a.shape[2] : a.shape[1]; var rightDim = transposeB ? b.shape[1] : b.shape[2]; var batchDims = tfjsCore.broadcast_util.assertAndGetBroadcastShape(a.shape.slice(0, -2), b.shape.slice(0, -2)); var out = backend.makeOutput(batchDims.concat([leftDim, rightDim]), a.dtype); var outId = backend.dataIdMap.get(out.dataId).id; var aShapeBytes = new Uint8Array(new Int32Array(a.shape).buffer); var bShapeBytes = new Uint8Array(new Int32Array(b.shape).buffer); wasmFusedMatMul(aId, aShapeBytes, a.shape.length, bId, bShapeBytes, b.shape.length, transposeA, transposeB, fusedActivation, biasId, preluActivationWeightsId, leakyreluAlpha || 0, outId); return out; } var _fusedMatMulConfig = { kernelName: tfjsCore._FusedMatMul, backendName: 'wasm', setupFunc: setup, kernelFunc: fusedBatchMatMul }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function createUnaryKernelConfig(kernelName, outType) { var wasmFunc; function setupFunc(backend) { wasmFunc = backend.wasm.cwrap(kernelName, null /* void */, [ 'number', 'number', 'number', ]); } function kernelFunc(args) { var backend = args.backend, x = args.inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var out = backend.makeOutput(x.shape, outType || x.dtype); var outId = backend.dataIdMap.get(out.dataId).id; // Short-circuit zero-sized tensors. if (tfjsCore.util.sizeFromShape(out.shape) === 0) { return out; } wasmFunc(xId, CppDType[x.dtype], outId); return out; } return { kernelName: kernelName, backendName: 'wasm', setupFunc: setupFunc, kernelFunc: kernelFunc }; } /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var absConfig = createUnaryKernelConfig(tfjsCore.Abs); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function createBinaryKernelConfig(kernelName, supportsFullBroadcast, dtype) { var wasmFunc; function setupFunc(backend) { wasmFunc = backend.wasm.cwrap(kernelName, null /* void */, [ 'number', 'array', 'number', 'number', 'array', 'number', 'number', 'number' // out_id ]); } function kernelFunc(args) { var backend = args.backend, inputs = args.inputs; var a = inputs.a, b = inputs.b; var aId = backend.dataIdMap.get(a.dataId).id; var bId = backend.dataIdMap.get(b.dataId).id; var outputType = dtype != null ? dtype : a.dtype; var newShape = tfjsCore.backend_util.assertAndGetBroadcastShape(a.shape, b.shape); var out = backend.makeOutput(newShape, outputType); // Short-circuit zero-sized tensors. if (tfjsCore.util.sizeFromShape(newShape) === 0) { return out; } var aShapeBytes = new Uint8Array(new Int32Array(a.shape).buffer); var bShapeBytes = new Uint8Array(new Int32Array(b.shape).buffer); var outId = backend.dataIdMap.get(out.dataId).id; var kernelFunc = function () { return wasmFunc(aId, aShapeBytes, a.shape.length, bId, bShapeBytes, b.shape.length, CppDType[a.dtype], outId); }; kernelFunc(); return out; } return { kernelName: kernelName, backendName: 'wasm', setupFunc: setupFunc, kernelFunc: kernelFunc }; } /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var addConfig = createBinaryKernelConfig(tfjsCore.Add); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFunc; function setupFunc(backend) { wasmFunc = backend.wasm.cwrap(tfjsCore.AddN, null /* void */, [ 'array', 'number', 'number', 'number', ]); } function addn(args) { var inputs = args.inputs, backend = args.backend; var out = backend.makeOutput(inputs[0].shape, inputs[0].dtype); // Short-circuit zero-sized tensors. if (tfjsCore.util.sizeFromShape(out.shape) === 0) { return out; } var inputIds = inputs.map(function (x) { return backend.dataIdMap.get(x.dataId).id; }); var inputIdsBytes = new Uint8Array(new Int32Array(inputIds).buffer); var outId = backend.dataIdMap.get(out.dataId).id; wasmFunc(inputIdsBytes, inputIds.length, CppDType[out.dtype], outId); return out; } var addNConfig = { kernelName: tfjsCore.AddN, backendName: 'wasm', setupFunc: setupFunc, kernelFunc: addn, }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function identity(args) { var x = args.inputs.x, backend = args.backend; var out = backend.makeOutput(x.shape, x.dtype); var inVals = backend.typedArrayFromHeap(x); var outVals = backend.typedArrayFromHeap(out); outVals.set(inVals); return out; } var identityConfig = { kernelName: tfjsCore.Identity, backendName: 'wasm', kernelFunc: identity, }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmTranspose; function setup$1(backend) { wasmTranspose = backend.wasm.cwrap(tfjsCore.Transpose, null /* void */, [ 'number', 'array', 'number', 'number', 'number', 'array', 'number', ]); } function transpose(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; // Reduce any dimensions with size one. Lower-rank transpose kernel performs // better due to simpler memory access pattern. var _a = removeOneSizeDims(inputs.x.shape, attrs.perm), reducedShape = _a[0], perm = _a[1]; var permIsNoOp = true; for (var i = 0; i < perm.length; i++) { if (perm[i] !== i) { permIsNoOp = false; } } var outShape = computeOutShape(inputs.x.shape, attrs.perm); var x = { dataId: inputs.x.dataId, shape: reducedShape, dtype: inputs.x.dtype }; if (permIsNoOp) { var cloned = identity({ inputs: inputs, backend: backend }); cloned.shape = outShape; return cloned; } var out = backend.makeOutput(outShape, x.dtype); var xId = backend.dataIdMap.get(x.dataId).id; var outId = backend.dataIdMap.get(out.dataId).id; var permBytes = new Uint8Array(new Int32Array(perm).buffer); var xShapeBytes = new Uint8Array(new Int32Array(x.shape).buffer); wasmTranspose(xId, xShapeBytes, x.shape.length, CppDType[x.dtype], outId, permBytes, perm.length); return out; } function computeOutShape(inShape, perm) { var outShape = new Array(inShape.length); for (var i = 0; i < outShape.length; i++) { outShape[i] = inShape[perm[i]]; } return outShape; } function removeOneSizeDims(shape, perm) { var newShape = []; var newPerm = []; for (var i = 0; i < shape.length; ++i) { if (shape[i] !== 1) { newShape.push(shape[i]); } if (shape[perm[i]] !== 1) { newPerm.push(perm[i]); } } for (var i = 0; i < newPerm.length; ++i) { var minValIdx = -1; for (var j = 0; j < newPerm.length; ++j) { if (newPerm[j] >= i && (minValIdx === -1 || newPerm[minValIdx] > newPerm[j])) { minValIdx = j; } } newPerm[minValIdx] = i; } return [newShape, newPerm]; } var transposeConfig = { kernelName: tfjsCore.Transpose, backendName: 'wasm', kernelFunc: transpose, setupFunc: setup$1, }; /** * @license * Copyright 2020 Google Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ /** * Compute permutation axes and do a transpose if necessary. * * Used by reduction ops. * @param x input TensorInfo * @param axis reduction axes * @param backend wasm backend instance */ function permuteAxesAndTranspose(x, axis, backend) { var xShape = x.shape; var xRank = x.shape.length; var originalAxes = tfjsCore.util.parseAxisParam(axis, xShape); var axes = originalAxes; var permutedAxes = tfjsCore.backend_util.getAxesPermutation(axes, xRank); var xTransposed = null; var inputWasTransposed = false; if (permutedAxes != null) { var newShape = new Array(xRank); for (var i = 0; i < newShape.length; i++) { newShape[i] = xShape[permutedAxes[i]]; } axes = tfjsCore.backend_util.getInnerMostAxes(axes.length, xRank); xTransposed = transpose({ inputs: { x: x }, attrs: { perm: permutedAxes }, backend: backend }); var xId = backend.dataIdMap.get(x.dataId).id; var transposedId = backend.dataIdMap.get(xTransposed.dataId).id; if (transposedId !== xId) { inputWasTransposed = true; } } return { transposed: xTransposed, originalAxes: originalAxes, axes: axes, inputWasTransposed: inputWasTransposed }; } /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmAll; function setup$2(backend) { wasmAll = backend.wasm.cwrap(tfjsCore.All, null /*void*/, ['number, number, number']); } function all(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var axis = attrs.axis, keepDims = attrs.keepDims; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var inputId = xId; var input = x; var _a = permuteAxesAndTranspose(x, axis, backend), transposed = _a.transposed, axes = _a.axes, originalAxes = _a.originalAxes, inputWasTransposed = _a.inputWasTransposed; if (inputWasTransposed) { var transposedId = backend.dataIdMap.get(transposed.dataId).id; input = transposed; inputId = transposedId; } var inputRank = input.shape.length; tfjsCore.backend_util.assertAxesAreInnerMostDims('all', axes, inputRank); var _b = tfjsCore.backend_util.computeOutAndReduceShapes(input.shape, axes), outShape = _b[0], reduceShape = _b[1]; var reduceSize = tfjsCore.util.sizeFromShape(reduceShape); var out = backend.makeOutput(outShape, x.dtype); if (tfjsCore.util.sizeFromShape(input.shape) !== 0) { var outId = backend.dataIdMap.get(out.dataId).id; wasmAll(inputId, reduceSize, outId); } if (inputWasTransposed) { // dispose of the transposed tensor. backend.disposeData(transposed.dataId); } if (keepDims) { // reshape var newShape = tfjsCore.backend_util.expandShapeToKeepDim(out.shape, originalAxes); out.shape = newShape; } return out; } var allConfig = { kernelName: tfjsCore.All, backendName: 'wasm', setupFunc: setup$2, kernelFunc: all }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmAny; function setup$3(backend) { wasmAny = backend.wasm.cwrap(tfjsCore.Any, null /*void*/, ['number, number, number']); } function any(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var axis = attrs.axis, keepDims = attrs.keepDims; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var inputId = xId; var input = x; var _a = permuteAxesAndTranspose(x, axis, backend), transposed = _a.transposed, axes = _a.axes, originalAxes = _a.originalAxes, inputWasTransposed = _a.inputWasTransposed; if (inputWasTransposed) { var transposedId = backend.dataIdMap.get(transposed.dataId).id; input = transposed; inputId = transposedId; } var inputRank = input.shape.length; tfjsCore.backend_util.assertAxesAreInnerMostDims('any', axes, inputRank); var _b = tfjsCore.backend_util.computeOutAndReduceShapes(input.shape, axes), outShape = _b[0], reduceShape = _b[1]; var reduceSize = tfjsCore.util.sizeFromShape(reduceShape); var out = backend.makeOutput(outShape, x.dtype); if (tfjsCore.util.sizeFromShape(input.shape) !== 0) { var outId = backend.dataIdMap.get(out.dataId).id; wasmAny(inputId, reduceSize, outId); } if (inputWasTransposed) { // dispose of the transposed tensor. backend.disposeData(transposed.dataId); } if (keepDims) { // reshape var newShape = tfjsCore.backend_util.expandShapeToKeepDim(out.shape, originalAxes); out.shape = newShape; } return out; } var anyConfig = { kernelName: tfjsCore.Any, backendName: 'wasm', setupFunc: setup$3, kernelFunc: any }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFunc$1; function setup$4(backend) { wasmFunc$1 = backend.wasm.cwrap(tfjsCore.ArgMax, null /* void */, [ 'number', 'number', 'number', 'number', 'number' // out_id ]); } function argmax(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var axis = attrs.axis; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var inputId = xId; var input = x; var _a = permuteAxesAndTranspose(x, axis, backend), transposed = _a.transposed, axes = _a.axes, inputWasTransposed = _a.inputWasTransposed; if (inputWasTransposed) { var transposedId = backend.dataIdMap.get(transposed.dataId).id; if (transposedId !== xId) { // transpose was not a no-op. We will need to dispose of this // once we are done. input = transposed; inputId = transposedId; } } var outShape = input.shape.slice(0, -1); var out = backend.makeOutput(outShape, 'int32'); var outId = backend.dataIdMap.get(out.dataId).id; var outerSize = tfjsCore.util.sizeFromShape(out.shape); var innerSize = input.shape[axes[0]]; wasmFunc$1(inputId, CppDType[input.dtype], outerSize, innerSize, outId); if (inputWasTransposed) { // dispose of the transposed tensor. backend.disposeData(transposed.dataId); } return out; } var argMaxConfig = { kernelName: tfjsCore.ArgMax, backendName: 'wasm', kernelFunc: argmax, setupFunc: setup$4 }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmAvgPool; function setup$5(backend) { wasmAvgPool = backend.wasm.cwrap(tfjsCore.AvgPool, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function avgPool(args) { var inputs = args.inputs, attrs = args.attrs, backend = args.backend; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var filterSize = attrs.filterSize, strides = attrs.strides, pad = attrs.pad, dimRoundingMode = attrs.dimRoundingMode; var convInfo = tfjsCore.backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode); var filterHeight = convInfo.filterHeight; var filterWidth = convInfo.filterWidth; var padTop = convInfo.padInfo.top; var padRight = convInfo.padInfo.right; var padBottom = convInfo.padInfo.bottom; var padLeft = convInfo.padInfo.left; var strideHeight = convInfo.strideHeight; var strideWidth = convInfo.strideWidth; var channels = convInfo.inChannels; if (convInfo.dataFormat !== 'channelsLast') { throw new Error("wasm backend does not support dataFormat:'" + (convInfo.dataFormat + "'. Please use 'channelsLast'.")); } if (convInfo.dilationWidth !== 1 || convInfo.dilationHeight !== 1) { throw new Error("was backend only supports average pooling with dilation = [1, 1], " + ("got [" + convInfo.dilationHeight + ", " + convInfo.dilationWidth + "].")); } var out = backend.makeOutput(convInfo.outShape, 'float32'); var outId = backend.dataIdMap.get(out.dataId).id; wasmAvgPool(xId, x.shape[0], x.shape[1], x.shape[2], filterHeight, filterWidth, padTop, padRight, padBottom, padLeft, strideHeight, strideWidth, channels, outId); return out; } var avgPoolConfig = { kernelName: tfjsCore.AvgPool, backendName: 'wasm', setupFunc: setup$5, kernelFunc: avgPool }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function reshape(args) { var inputs = args.inputs, attrs = args.attrs; var x = inputs.x; var shape = attrs.shape; var xSize = tfjsCore.util.sizeFromShape(x.shape); var $shape = tfjsCore.util.inferFromImplicitShape(shape, xSize); tfjsCore.util.assert(xSize === tfjsCore.util.sizeFromShape($shape), function () { return "new shape: " + $shape + ", old shape: " + x.shape + ". New shape and old " + "shape must have the same number of elements."; }); // Backend needs to track refCount for the dataId for reshape op args.backend.incRef(x.dataId); return { dataId: x.dataId, shape: $shape, dtype: x.dtype }; } var reshapeConfig = { kernelName: tfjsCore.Reshape, backendName: 'wasm', kernelFunc: reshape }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmBatchMatMul; function setup$6(backend) { wasmBatchMatMul = backend.wasm.cwrap(tfjsCore.BatchMatMul, null /* void */, [ 'number', 'array', 'number', 'number', 'array', 'number', 'number', 'number', 'number' // out_id ]); } function batchMatMul(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var a = inputs.a, b = inputs.b; var transposeA = attrs.transposeA, transposeB = attrs.transposeB; if (a.dtype !== 'float32' || b.dtype !== 'float32') { throw new Error("BatchMatMul for non non-float32 tensors not yet supported."); } var aRank = a.shape.length; var bRank = b.shape.length; var innerShapeA = transposeA ? a.shape[aRank - 2] : a.shape[aRank - 1]; var innerShapeB = transposeB ? b.shape[bRank - 1] : b.shape[bRank - 2]; var outerShapeA = transposeA ? a.shape[aRank - 1] : a.shape[aRank - 2]; var outerShapeB = transposeB ? b.shape[bRank - 2] : b.shape[bRank - 1]; var outerDimsA = a.shape.slice(0, -2); var outerDimsB = b.shape.slice(0, -2); var batchDimA = tfjsCore.util.sizeFromShape(outerDimsA); var batchDimB = tfjsCore.util.sizeFromShape(outerDimsB); var outShapeOuterDims = tfjsCore.broadcast_util.assertAndGetBroadcastShape(a.shape.slice(0, -2), b.shape.slice(0, -2)); var outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]); tfjsCore.util.assert(innerShapeA === innerShapeB, function () { return "Error in matMul: inner shapes (" + innerShapeA + ") and (" + (innerShapeB + ") of Tensors with shapes " + a.shape + " and ") + (b.shape + " and transposeA=" + transposeA) + (" and transposeB=" + transposeB + " must match."); }); var a3dShape = transposeA ? [batchDimA, innerShapeA, outerShapeA] : [batchDimA, outerShapeA, innerShapeA]; var b3dShape = transposeB ? [batchDimB, outerShapeB, innerShapeB] : [batchDimB, innerShapeB, outerShapeB]; // The rest of the implementation is designed to operate on rank-3 tensors var a3d = reshape({ inputs: { x: a }, backend: backend, attrs: { shape: a3dShape } }); var b3d = reshape({ inputs: { x: b }, backend: backend, attrs: { shape: b3dShape } }); var a3dId = backend.dataIdMap.get(a3d.dataId).id; var b3dId = backend.dataIdMap.get(b3d.dataId).id; var leftDim = transposeA ? a3d.shape[2] : a3d.shape[1]; var rightDim = transposeB ? b3d.shape[1] : b3d.shape[2]; var batchDim = Math.max(batchDimA, batchDimB); var out = backend.makeOutput([batchDim, leftDim, rightDim], a3d.dtype); var outId = backend.dataIdMap.get(out.dataId).id; var aShapeBytes = new Uint8Array(new Int32Array(a3d.shape).buffer); var bShapeBytes = new Uint8Array(new Int32Array(b3d.shape).buffer); wasmBatchMatMul(a3dId, aShapeBytes, a3d.shape.length, b3dId, bShapeBytes, b3d.shape.length, transposeA, transposeB, outId); backend.disposeData(a3d.dataId); backend.disposeData(b3d.dataId); out.shape = outShape; return out; } var batchMatMulConfig = { kernelName: tfjsCore.BatchMatMul, backendName: 'wasm', setupFunc: setup$6, kernelFunc: batchMatMul }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function concatImpl(inputs, outShape, dtype, simplyConcat) { const outVals = tfjsCore.util.getArrayFromDType(dtype, tfjsCore.util.sizeFromShape(outShape)); if (simplyConcat && dtype !== 'string') { // Use built-in TypedArray.set() method for speed. let offset = 0; inputs.forEach(input => { const size = tfjsCore.util.sizeFromShape(input.shape); outVals.set(input.vals, offset); offset += size; }); } else { let colOffset = 0; inputs.forEach(input => { const decodedData = dtype === 'string' ? tfjsCore.backend_util.fromUint8ToStringArray(input.vals) : input.vals; let tIdx = 0; for (let row = 0; row < input.shape[0]; ++row) { const resIdx = row * outShape[1] + colOffset; for (let col = 0; col < input.shape[1]; ++col) { outVals[resIdx + col] = decodedData[tIdx++]; } } colOffset += input.shape[1]; }); } return outVals; } /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function rangeImpl(start, stop, step, dtype) { const sameStartStop = start === stop; const increasingRangeNegativeStep = start < stop && step < 0; const decreasingRangePositiveStep = stop < start && step > 1; if (sameStartStop || increasingRangeNegativeStep || decreasingRangePositiveStep) { return tfjsCore.util.makeZerosTypedArray(0, dtype); } const numElements = Math.abs(Math.ceil((stop - start) / step)); const values = tfjsCore.util.makeZerosTypedArray(numElements, dtype); if (stop < start && step === 1) { // Auto adjust the step's sign if it hasn't been set // (or was set to 1) step = -1; } values[0] = start; for (let i = 1; i < values.length; i++) { values[i] = values[i - 1] + step; } return values; } /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function sliceImpl(vals, begin, size, shape, dtype) { const isContinous = tfjsCore.slice_util.isSliceContinous(shape, begin, size); const length = tfjsCore.util.sizeFromShape(size); const xStrides = tfjsCore.util.computeStrides(shape); if (isContinous) { const flatOffset = tfjsCore.slice_util.computeFlatOffset(begin, xStrides); if (dtype === 'string') { return vals.slice(flatOffset, flatOffset + length); } return vals.subarray(flatOffset, flatOffset + length); } const decodedData = dtype === 'string' ? tfjsCore.backend_util.fromUint8ToStringArray(vals) : vals; const inBuf = tfjsCore.buffer(shape, dtype, decodedData); const outBuf = tfjsCore.buffer(size, dtype); for (let i = 0; i < outBuf.size; ++i) { const outLoc = outBuf.indexToLoc(i); const inLoc = outLoc.map((idx, j) => idx + begin[j]); outBuf.set(inBuf.get(...inLoc), ...outLoc); } if (dtype === 'string') { return tfjsCore.backend_util.fromStringArrayToUint8(outBuf.values); } return outBuf.values; } /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function slice(args) { var x = args.inputs.x, _a = args.attrs, begin = _a.begin, size = _a.size, backend = args.backend; var _b = tfjsCore.slice_util.parseSliceParams(x, begin, size), begin_ = _b[0], size_ = _b[1]; var isContinous = tfjsCore.slice_util.isSliceContinous(x.shape, begin_, size_); var xVals = backend.readSync(x.dataId); var out = backend.makeOutput(size_, x.dtype); var xStrides = tfjsCore.util.computeStrides(x.shape); var outData = backend.dataIdMap.get(out.dataId); if (isContinous) { var flatOffset = tfjsCore.slice_util.computeFlatOffset(begin_, xStrides); if (x.dtype === 'string') { outData.stringBytes = xVals .slice(flatOffset, flatOffset + tfjsCore.util.sizeFromShape(size_)); } else { var outVals_1 = backend.typedArrayFromHeap(out); outVals_1.set(xVals .subarray(flatOffset, flatOffset + tfjsCore.util.sizeFromShape(size_))); } return out; } if (x.dtype === 'string') { var res = sliceImpl(xVals, begin_, size_, x.shape, x.dtype); outData.stringBytes = res; return out; } var outVals = backend.typedArrayFromHeap(out); var rank = x.shape.length; if (rank === 2) { slice2d(xVals, xStrides[0], outVals, begin_, size_); } else if (rank === 3) { slice3d(xVals, xStrides[0], xStrides[1], outVals, begin_, size_); } else if (rank === 4) { slice4d(xVals, xStrides[0], xStrides[1], xStrides[2], outVals, begin_, size_); } else { var res = sliceImpl(xVals, begin_, size_, x.shape, x.dtype); outVals.set(res); } return out; } function slice2d(xVals, xStride, outVals, begin, size) { var outOffset = 0; var beginI = begin[0]; var beginJ = begin[1]; var endI = beginI + size[0]; for (var i = beginI; i < endI; i++) { var xOffset = i * xStride + beginJ; outVals.set(xVals.subarray(xOffset, xOffset + size[1]), outOffset); outOffset += size[1]; } } function slice3d(xVals, xStride1, xStride2, outVals, begin, size) { var outOffset = 0; var beginI = begin[0]; var beginJ = begin[1]; var beginK = begin[2]; var endI = beginI + size[0]; var endJ = beginJ + size[1]; for (var i = beginI; i < endI; i++) { for (var j = beginJ; j < endJ; j++) { var xOffset = i * xStride1 + j * xStride2 + beginK; outVals.set(xVals.subarray(xOffset, xOffset + size[2]), outOffset); outOffset += size[2]; } } } function slice4d(xVals, xStride1, xStride2, xStride3, outVals, begin, size) { var outOffset = 0; var beginI = begin[0]; var beginJ = begin[1]; var beginK = begin[2]; var endI = beginI + size[0]; var endJ = beginJ + size[1]; var endK = beginK + size[2]; var beginL = begin[3]; for (var i = beginI; i < endI; i++) { for (var j = beginJ; j < endJ; j++) { for (var k = beginK; k < endK; k++) { var xOffset = i * xStride1 + j * xStride2 + k * xStride3 + beginL; outVals.set(xVals.subarray(xOffset, xOffset + size[3]), outOffset); outOffset += size[3]; } } } } var sliceConfig = { kernelName: tfjsCore.Slice, backendName: 'wasm', kernelFunc: slice, }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function batchToSpaceND(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var x = inputs.x; var blockShape = attrs.blockShape, crops = attrs.crops; var prod = blockShape.reduce(function (a, b) { return a * b; }); var reshaped = tfjsCore.backend_util.getReshaped(x.shape, blockShape, prod); var permuted = tfjsCore.backend_util.getPermuted(reshaped.length, blockShape.length); var reshapedPermuted = tfjsCore.backend_util.getReshapedPermuted(x.shape, blockShape, prod); var sliceBeginCoords = tfjsCore.backend_util.getSliceBeginCoords(crops, blockShape.length); var sliceSize = tfjsCore.backend_util.getSliceSize(reshapedPermuted, crops, blockShape.length); var xReshaped = reshape({ inputs: { x: x }, backend: backend, attrs: { shape: reshaped } }); var xTransposed = transpose({ inputs: { x: xReshaped }, backend: backend, attrs: { perm: permuted } }); var xTransposedReshaped = reshape({ inputs: { x: xTransposed }, backend: backend, attrs: { shape: reshapedPermuted } }); var result = slice({ inputs: { x: xTransposedReshaped }, backend: backend, attrs: { begin: sliceBeginCoords, size: sliceSize } }); backend.disposeData(xReshaped.dataId); backend.disposeData(xTransposed.dataId); backend.disposeData(xReshaped.dataId); return result; } var batchToSpaceNDConfig = { kernelName: tfjsCore.BatchToSpaceND, backendName: 'wasm', kernelFunc: batchToSpaceND }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function cast(args) { var x = args.inputs.x, dtype = args.attrs.dtype, backend = args.backend; var out = backend.makeOutput(x.shape, dtype); var inVals = backend.typedArrayFromHeap(x); var outVals = backend.typedArrayFromHeap(out); outVals.set(inVals); return out; } var castConfig = { kernelName: tfjsCore.Cast, backendName: 'wasm', kernelFunc: cast, }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var ceilConfig = createUnaryKernelConfig(tfjsCore.Ceil); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmClip; function setup$7(backend) { wasmClip = backend.wasm.cwrap(tfjsCore.ClipByValue, null /* void */, [ 'number', 'number', 'number', 'number' // out_id ]); } function clip(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var x = inputs.x; var clipValueMin = attrs.clipValueMin, clipValueMax = attrs.clipValueMax; var xId = backend.dataIdMap.get(x.dataId).id; var out = backend.makeOutput(x.shape, x.dtype); var outId = backend.dataIdMap.get(out.dataId).id; wasmClip(xId, clipValueMin, clipValueMax, outId); return out; } var clipByValueConfig = { kernelName: tfjsCore.ClipByValue, backendName: 'wasm', setupFunc: setup$7, kernelFunc: clip }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function concat(args) { var inputs = args.inputs, backend = args.backend; var axis = tfjsCore.util.parseAxisParam(args.attrs.axis, inputs[0].shape)[0]; var outShape = tfjsCore.backend_util.computeOutShape(inputs.map(function (t) { return t.shape; }), axis); // Keep only non-empty tensors (ignore tensors with 0 in their shape). var $inputs = inputs.filter(function (t) { return tfjsCore.util.sizeFromShape(t.shape) > 0; }); if ($inputs.length === 1) { return identity({ inputs: { x: $inputs[0] }, backend: backend }); } var out = backend.makeOutput(outShape, inputs[0].dtype); if (tfjsCore.util.sizeFromShape(outShape) === 0) { return out; } var shapes = $inputs.map(function (t) { return t.shape; }); tfjsCore.backend_util.assertParamsConsistent(shapes, axis); if ($inputs[0].dtype === 'string') { // Any concat of n-dimensional tensors across any axis can be reduced to // a concatenation of two-dimensional tensors across the axis 1 by first // partitioning the axes of the original tensors into those less than the // axis to be concatenated and the rest. Then reshape the tensors // into a two-dimensional tensor by collapsing these two sets of axes and // concatenate the resulting matrices across the axis 1, finally reshaping // the result to have the proper shape. var inputs2D = $inputs.map(function (t) { var innerSize = tfjsCore.util.sizeFromShape(t.shape.slice(axis)); var shape = [-1, innerSize]; return reshape({ inputs: { x: t }, backend: backend, attrs: { shape: shape } }); }); var inputsValShapes = inputs2D.map(function (t) { return { vals: backend.readSync(t.dataId), shape: t.shape }; }); // Concats 2d tensors along axis=1. outShape = tfjsCore.backend_util.computeOutShape(inputs2D.map(function (t) { return t.shape; }), 1 /* axis */); var simplyConcat = inputs2D[0].shape[0] === 1; var outVals_1 = concatImpl(inputsValShapes, outShape, inputs[0].dtype, simplyConcat); var finalOutShape = tfjsCore.backend_util.computeOutShape($inputs.map(function (t) { return t.shape; }), axis); out.shape = finalOutShape; var outData = backend.dataIdMap.get(out.dataId); outData.stringBytes = tfjsCore.backend_util.fromStringArrayToUint8(outVals_1); inputs2D.forEach(function (t) { return backend.disposeData(t.dataId); }); return out; } var batchDim = tfjsCore.util.sizeFromShape($inputs[0].shape.slice(0, axis)); var sumInnerDims = 0; var innerDims = $inputs.map(function (input) { var innerDim = tfjsCore.util.sizeFromShape(input.shape.slice(axis)); sumInnerDims += innerDim; return innerDim; }); var inVals = $inputs.map(function (input) { return backend.typedArrayFromHeap(input); }); var outVals = backend.typedArrayFromHeap(out); for (var b = 0; b < batchDim; b++) { var outOffset = b * sumInnerDims; for (var i = 0; i < inVals.length; i++) { var innerDim = innerDims[i]; var inOffset = b * innerDim; var vals = inVals[i].subarray(inOffset, inOffset + innerDim); outVals.set(vals, outOffset); outOffset += innerDim; } } return out; } var concatConfig = { kernelName: tfjsCore.Concat, backendName: 'wasm', kernelFunc: concat, }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmConv2d; function setup$8(backend) { wasmConv2d = backend.wasm.cwrap(tfjsCore.Conv2D, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function conv2d(args) { var inputs = args.inputs, attrs = args.attrs, backend = args.backend; var x = inputs.x, filter = inputs.filter; var xId = backend.dataIdMap.get(x.dataId).id; var filterId = backend.dataIdMap.get(filter.dataId).id; var strides = attrs.strides, dilations = attrs.dilations, pad = attrs.pad, dimRoundingMode = attrs.dimRoundingMode, dataFormat = attrs.dataFormat; var $dataFormat = tfjsCore.backend_util.convertConv2DDataFormat(dataFormat); var convInfo = tfjsCore.backend_util.computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false, $dataFormat); var filterHeight = convInfo.filterHeight; var filterWidth = convInfo.filterWidth; var padTop = convInfo.padInfo.top; var padRight = convInfo.padInfo.right; var padBottom = convInfo.padInfo.bottom; var padLeft = convInfo.padInfo.left; var dilationHeight = convInfo.dilationHeight; var dilationWidth = convInfo.dilationWidth; var strideHeight = convInfo.strideHeight; var strideWidth = convInfo.strideWidth; var inputChannels = convInfo.inChannels; var outputChannels = convInfo.outChannels; var isSamePad = convInfo.padInfo.type === 'SAME' ? 1 : 0; if (convInfo.dataFormat !== 'channelsLast') { throw new Error("wasm backend Conv2D does not support dataFormat:'" + (convInfo.dataFormat + "'. Please use 'channelsLast'.")); } var out = backend.makeOutput(convInfo.outShape, 'float32'); var outId = backend.dataIdMap.get(out.dataId).id; wasmConv2d(xId, x.shape[0], x.shape[1], x.shape[2], filterId, filterHeight, filterWidth, padTop, padRight, padBottom, padLeft, isSamePad, dilationHeight, dilationWidth, strideHeight, strideWidth, inputChannels, outputChannels, outId); return out; } var conv2DConfig = { kernelName: tfjsCore.Conv2D, backendName: 'wasm', setupFunc: setup$8, kernelFunc: conv2d }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmConv2DBackpropInput; function setup$9(backend) { wasmConv2DBackpropInput = backend.wasm.cwrap(tfjsCore.Conv2DBackpropInput, null, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function conv2DBackpropInput(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var dy = inputs.dy, filter = inputs.filter; var strides = attrs.strides, pad = attrs.pad, dataFormat = attrs.dataFormat, dimRoundingMode = attrs.dimRoundingMode, inputShape = attrs.inputShape; var dilations = 1; var $dataFormat = tfjsCore.backend_util.convertConv2DDataFormat(dataFormat); var convInfo = tfjsCore.backend_util.computeConv2DInfo(inputShape, filter.shape, strides, dilations, pad, dimRoundingMode, false /* depthwise */, $dataFormat); var batchSize = convInfo.batchSize, filterHeight = convInfo.filterHeight, filterWidth = convInfo.filterWidth, inChannels = convInfo.inChannels, inHeight = convInfo.inHeight, inWidth = convInfo.inWidth, outChannels = convInfo.outChannels, outHeight = convInfo.outHeight, outWidth = convInfo.outWidth, strideHeight = convInfo.strideHeight, strideWidth = convInfo.strideWidth; var topPad = filterHeight - 1 - convInfo.padInfo.top; var leftPad = filterWidth - 1 - convInfo.padInfo.left; var isChannelsLast = convInfo.dataFormat === 'channelsLast'; var dxStrides = tfjsCore.util.computeStrides(convInfo.inShape); var dyStrides = tfjsCore.util.computeStrides(dy.shape); var _a = tfjsCore.util.computeStrides(filter.shape), fltS0 = _a[0], fltS1 = _a[1], fltS2 = _a[2]; var xBatchStride = dxStrides[0]; var xRowStride = isChannelsLast ? dxStrides[1] : dxStrides[2]; var xColStride = isChannelsLast ? dxStrides[2] : 1; var xChannelStride = isChannelsLast ? 1 : dxStrides[1]; var yBatchStride = dyStrides[0]; var yRowStride = isChannelsLast ? dyStrides[1] : dyStrides[2]; var yColStride = isChannelsLast ? dyStrides[2] : 1; var yChannelStride = isChannelsLast ? 1 : dyStrides[1]; var out = backend.makeOutput(convInfo.inShape, 'float32'); var outId = backend.dataIdMap.get(out.dataId).id; var dyId = backend.dataIdMap.get(dy.dataId).id; var filterId = backend.dataIdMap.get(filter.dataId).id; wasmConv2DBackpropInput(dyId, filterId, batchSize, filterHeight, filterWidth, inHeight, inWidth, inChannels, outHeight, outWidth, outChannels, strideHeight, strideWidth, topPad, leftPad, fltS0, fltS1, fltS2, xBatchStride, xRowStride, xColStride, xChannelStride, yBatchStride, yRowStride, yColStride, yChannelStride, outId); return out; } var conv2DBackpropInputConfig = { kernelName: tfjsCore.Conv2DBackpropInput, backendName: 'wasm', setupFunc: setup$9, kernelFunc: conv2DBackpropInput }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var cosConfig = createUnaryKernelConfig(tfjsCore.Cos); /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var coshConfig = createUnaryKernelConfig(tfjsCore.Cosh); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ // Must match enum in CropAndResize.cc var InterpolationMethod; (function (InterpolationMethod) { InterpolationMethod[InterpolationMethod["bilinear"] = 0] = "bilinear"; InterpolationMethod[InterpolationMethod["nearest"] = 1] = "nearest"; })(InterpolationMethod || (InterpolationMethod = {})); var wasmCropAndResize; function setup$a(backend) { wasmCropAndResize = backend.wasm.cwrap(tfjsCore.CropAndResize, null /*void*/, [ 'number', 'number', 'number', 'number', 'array', 'number', 'number', 'number', 'number', 'number' // out id ]); } function cropAndResize(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var method = attrs.method, extrapolationValue = attrs.extrapolationValue, cropSize = attrs.cropSize; var image = inputs.image, boxes = inputs.boxes, boxInd = inputs.boxInd; var numBoxes = boxes.shape[0]; var _a = cropSize, cropHeight = _a[0], cropWidth = _a[1]; var outShape = [numBoxes, cropHeight, cropWidth, image.shape[3]]; var imagesData = backend.dataIdMap.get(image.dataId); var castedData; if (image.dtype !== 'float32') { castedData = cast({ backend: backend, inputs: { x: image }, attrs: { dtype: 'float32' } }); imagesData = backend.dataIdMap.get(castedData.dataId); } var imagesId = imagesData.id; var boxesId = backend.dataIdMap.get(boxes.dataId).id; var boxIndId = backend.dataIdMap.get(boxInd.dataId).id; var out = backend.makeOutput(outShape, 'float32'); var outId = backend.dataIdMap.get(out.dataId).id; var imagesShapeBytes = new Uint8Array(new Int32Array(image.shape).buffer); wasmCropAndResize(imagesId, boxesId, boxIndId, numBoxes, imagesShapeBytes, cropHeight, cropWidth, InterpolationMethod[method], extrapolationValue, outId); if (castedData != null) { backend.disposeData(castedData.dataId); } return out; } var cropAndResizeConfig = { kernelName: tfjsCore.CropAndResize, backendName: 'wasm', setupFunc: setup$a, kernelFunc: cropAndResize }; /** * @license * Copyright 2022 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmCumprod; function setup$b(backend) { wasmCumprod = backend.wasm.cwrap(tfjsCore.Cumprod, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number' // dtype ]); } function cumprod(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var x = inputs.x; var axis = attrs.axis, exclusive = attrs.exclusive, reverse = attrs.reverse; var xRank = x.shape.length; tfjsCore.util.assert(x.dtype === 'float32' || x.dtype === 'int32', function () { return "cumprod does not support " + x.dtype + " tensors in the WASM backend"; }); // permute required axis to inner most axis var permutation = tfjsCore.backend_util.getAxesPermutation([axis], xRank); var permutedX = x; if (permutation !== null) { permutedX = transpose({ inputs: { x: x }, attrs: { perm: permutation }, backend: backend }); } var permutedAxis = tfjsCore.backend_util.getInnerMostAxes(1, xRank)[0]; tfjsCore.backend_util.assertAxesAreInnerMostDims('cumprod', [permutedAxis], xRank); var permutedOut = backend.makeOutput(permutedX.shape, permutedX.dtype); var finalDim = permutedX.shape[permutedAxis]; var permutedXId = backend.dataIdMap.get(permutedX.dataId).id; var permutedOutId = backend.dataIdMap.get(permutedOut.dataId).id; wasmCumprod(permutedXId, exclusive ? 1 : 0, reverse ? 1 : 0, finalDim, permutedOutId, CppDType[x.dtype]); // transpose data back if permuted var out = permutedOut; if (permutation !== null) { var undoPermutation = tfjsCore.backend_util.getUndoAxesPermutation(permutation); out = transpose({ inputs: { x: permutedOut }, attrs: { perm: undoPermutation }, backend: backend }); backend.disposeData(permutedX.dataId); backend.disposeData(permutedOut.dataId); } return out; } var cumprodConfig = { kernelName: tfjsCore.Cumprod, backendName: 'wasm', setupFunc: setup$b, kernelFunc: cumprod }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmCumsum; function setup$c(backend) { wasmCumsum = backend.wasm.cwrap(tfjsCore.Cumsum, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number' // dtype ]); } function cumsum(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var x = inputs.x; var axis = attrs.axis, exclusive = attrs.exclusive, reverse = attrs.reverse; var xRank = x.shape.length; tfjsCore.util.assert(x.dtype === 'float32' || x.dtype === 'int32', function () { return "cumsum does not support " + x.dtype + " tensors in the WASM backend"; }); // permute required axis to inner most axis var permutation = tfjsCore.backend_util.getAxesPermutation([axis], xRank); var permutedX = x; if (permutation !== null) { permutedX = transpose({ inputs: { x: x }, attrs: { perm: permutation }, backend: backend }); } var permutedAxis = tfjsCore.backend_util.getInnerMostAxes(1, xRank)[0]; tfjsCore.backend_util.assertAxesAreInnerMostDims('cumsum', [permutedAxis], xRank); var permutedOut = backend.makeOutput(permutedX.shape, permutedX.dtype); var finalDim = permutedX.shape[permutedAxis]; var permutedXId = backend.dataIdMap.get(permutedX.dataId).id; var permutedOutId = backend.dataIdMap.get(permutedOut.dataId).id; wasmCumsum(permutedXId, exclusive ? 1 : 0, reverse ? 1 : 0, finalDim, permutedOutId, CppDType[x.dtype]); // transpose data back if permuted var out = permutedOut; if (permutation !== null) { var undoPermutation = tfjsCore.backend_util.getUndoAxesPermutation(permutation); out = transpose({ inputs: { x: permutedOut }, attrs: { perm: undoPermutation }, backend: backend }); backend.disposeData(permutedX.dataId); backend.disposeData(permutedOut.dataId); } return out; } var cumsumConfig = { kernelName: tfjsCore.Cumsum, backendName: 'wasm', setupFunc: setup$c, kernelFunc: cumsum }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmDepthToSpace; function setup$d(backend) { wasmDepthToSpace = backend.wasm.cwrap(tfjsCore.DepthToSpace, null /*void*/, [ 'number', 'number', 'number', 'array', 'number', 'array', 'array', 'number', 'number', ]); } function depthToSpace(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var x = inputs.x; var blockSize = attrs.blockSize, dataFormat = attrs.dataFormat; var batchSize = x.shape[0]; var inputHeight = (dataFormat === 'NHWC') ? x.shape[1] : x.shape[2]; var inputWidth = (dataFormat === 'NHWC') ? x.shape[2] : x.shape[3]; var inputDepth = (dataFormat === 'NHWC') ? x.shape[3] : x.shape[1]; var outputHeight = inputHeight * blockSize; var outputWidth = inputWidth * blockSize; var outputDepth = inputDepth / (blockSize * blockSize); var outputShape = (dataFormat === 'NHWC') ? [batchSize, outputHeight, outputWidth, outputDepth] : [batchSize, outputDepth, outputHeight, outputWidth]; var out = backend.makeOutput(outputShape, 'float32'); var xData = backend.dataIdMap.get(x.dataId); var xId = xData.id; var xStridesBytes = new Uint8Array(new Int32Array(tfjsCore.util.computeStrides(x.shape)).buffer); var outputShapeBytes = new Uint8Array(new Int32Array(outputShape).buffer); var outStridesBytes = new Uint8Array(new Int32Array(tfjsCore.util.computeStrides(outputShape)).buffer); var outId = backend.dataIdMap.get(out.dataId).id; var channelsLast = dataFormat === 'NHWC' ? 1 : 0; wasmDepthToSpace(xId, blockSize, channelsLast, xStridesBytes, x.shape.length - 1, outputShapeBytes, outStridesBytes, outputShape.length, outId); return out; } var depthToSpaceConfig = { kernelName: tfjsCore.DepthToSpace, backendName: 'wasm', setupFunc: setup$d, kernelFunc: depthToSpace }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmDepthwiseConv2d; function setup$e(backend) { wasmDepthwiseConv2d = backend.wasm.cwrap(tfjsCore.DepthwiseConv2dNative, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function depthwiseConv2d(args) { var inputs = args.inputs, attrs = args.attrs, backend = args.backend; var x = inputs.x, filter = inputs.filter; var xId = backend.dataIdMap.get(x.dataId).id; var filterId = backend.dataIdMap.get(filter.dataId).id; var strides = attrs.strides, dilations = attrs.dilations, pad = attrs.pad, dimRoundingMode = attrs.dimRoundingMode; var $dilations = dilations == null ? [1, 1] : dilations; var convInfo = tfjsCore.backend_util.computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true /* depthwise */); var filterHeight = convInfo.filterHeight; var filterWidth = convInfo.filterWidth; var padTop = convInfo.padInfo.top; var padRight = convInfo.padInfo.right; var padBottom = convInfo.padInfo.bottom; var padLeft = convInfo.padInfo.left; var dilationHeight = convInfo.dilationHeight; var dilationWidth = convInfo.dilationWidth; var strideHeight = convInfo.strideHeight; var strideWidth = convInfo.strideWidth; var inputChannels = convInfo.inChannels; var outputChannels = convInfo.outChannels; var isSamePad = convInfo.padInfo.type === 'SAME' ? 1 : 0; if (convInfo.dataFormat !== 'channelsLast') { throw new Error("wasm backend DepthwiseConv2dNative does not support dataFormat:'" + (convInfo.dataFormat + "'. Please use 'channelsLast'.")); } var out = backend.makeOutput(convInfo.outShape, 'float32'); var outId = backend.dataIdMap.get(out.dataId).id; wasmDepthwiseConv2d(xId, x.shape[0], x.shape[1], x.shape[2], filterId, filterHeight, filterWidth, padTop, padRight, padBottom, padLeft, isSamePad, dilationHeight, dilationWidth, strideHeight, strideWidth, inputChannels, outputChannels, outId); return out; } var depthwiseConv2dNativeConfig = { kernelName: tfjsCore.DepthwiseConv2dNative, backendName: 'wasm', setupFunc: setup$e, kernelFunc: depthwiseConv2d }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var eluConfig = createUnaryKernelConfig(tfjsCore.Elu); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var supportsFullBroadcast = false; var equalConfig = createBinaryKernelConfig(tfjsCore.Equal, supportsFullBroadcast, 'bool'); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var expConfig = createUnaryKernelConfig(tfjsCore.Exp, 'float32'); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function expandDims(args) { var inputs = args.inputs, attrs = args.attrs, backend = args.backend; var input = inputs.input; var dim = attrs.dim; var inputRank = input.shape.length; var newShape = input.shape.slice(); var $dim = dim; if (dim < 0) { // Negative value is counted from the tail of rank. tfjsCore.util.assert(-(inputRank + 1) <= dim, function () { return "Axis must be in the interval [" + -(inputRank + 1) + ", " + inputRank + "]"; }); $dim = inputRank + dim + 1; } newShape.splice($dim, 0, 1); return reshape({ inputs: { x: input }, backend: backend, attrs: { shape: newShape } }); } var expandDimsConfig = { kernelName: tfjsCore.ExpandDims, backendName: 'wasm', kernelFunc: expandDims, }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function fill(args) { var _a = args.attrs, shape = _a.shape, value = _a.value, dtype = _a.dtype, backend = args.backend; var out = backend.makeOutput(shape, dtype); var outVals = backend.typedArrayFromHeap(out); outVals.fill(value); return out; } var fillConfig = { kernelName: tfjsCore.Fill, backendName: 'wasm', kernelFunc: fill, }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFlipLeftRight; function setup$f(backend) { wasmFlipLeftRight = backend.wasm.cwrap(tfjsCore.FlipLeftRight, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number', ]); } function flipLeftRight(args) { var inputs = args.inputs, backend = args.backend; var image = inputs.image; var out = backend.makeOutput(image.shape, image.dtype); var imageId = backend.dataIdMap.get(image.dataId).id; var outId = backend.dataIdMap.get(out.dataId).id; var _a = image.shape, batch = _a[0], imageHeight = _a[1], imageWidth = _a[2], numChannels = _a[3]; wasmFlipLeftRight(imageId, batch, imageHeight, imageWidth, numChannels, outId); return out; } var flipLeftRightConfig = { kernelName: tfjsCore.FlipLeftRight, backendName: 'wasm', kernelFunc: flipLeftRight, setupFunc: setup$f }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var floorConfig = createUnaryKernelConfig(tfjsCore.Floor); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var floorDivConfig = createBinaryKernelConfig(tfjsCore.FloorDiv); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmBatchNorm; function setup$g(backend) { wasmBatchNorm = backend.wasm.cwrap(tfjsCore.FusedBatchNorm, null /* void */, ['number', 'number', 'number', 'number', 'number', 'number', 'number']); } function fusedBatchNorm(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var varianceEpsilon = attrs.varianceEpsilon; var x = inputs.x, mean = inputs.mean, variance = inputs.variance, offset = inputs.offset, scale = inputs.scale; var xId = backend.dataIdMap.get(x.dataId).id; var meanId = backend.dataIdMap.get(mean.dataId).id; var varianceId = backend.dataIdMap.get(variance.dataId).id; var offsetId = offset != null ? backend.dataIdMap.get(offset.dataId).id : 0; var scaleId = scale != null ? backend.dataIdMap.get(scale.dataId).id : 0; var out = backend.makeOutput(x.shape, x.dtype); // Short-circuit zero-sized tensors. if (tfjsCore.util.sizeFromShape(x.shape) === 0) { return out; } var outId = backend.dataIdMap.get(out.dataId).id; wasmBatchNorm(xId, meanId, varianceId, offsetId, scaleId, varianceEpsilon, outId); return out; } var fusedBatchNormConfig = { kernelName: tfjsCore.FusedBatchNorm, backendName: 'wasm', setupFunc: setup$g, kernelFunc: fusedBatchNorm }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFusedConv2d; function setup$h(backend) { wasmFusedConv2d = backend.wasm.cwrap(tfjsCore.FusedConv2D, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function fusedConv2d(args) { var inputs = args.inputs, attrs = args.attrs, backend = args.backend; var x = inputs.x, filter = inputs.filter, bias = inputs.bias, preluActivationWeights = inputs.preluActivationWeights; var strides = attrs.strides, pad = attrs.pad, dilations = attrs.dilations, dataFormat = attrs.dataFormat, dimRoundingMode = attrs.dimRoundingMode, activation = attrs.activation, leakyreluAlpha = attrs.leakyreluAlpha; var convInfo = tfjsCore.backend_util.computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode); var fusedActivation = FusableActivation[activation]; if (fusedActivation == null) { throw new Error(activation + " activation not yet supported for FusedConv2D " + "in the wasm backend."); } var xId = backend.dataIdMap.get(x.dataId).id; var filterId = backend.dataIdMap.get(filter.dataId).id; var outputChannels = convInfo.outChannels; var biasId = 0; if (bias != null) { var biasData = backend.dataIdMap.get(bias.dataId); if (biasData.shape.length !== 1) { throw new Error("FusedConv2D only supports rank-1 bias but got " + ("rank " + biasData.shape.length + ".")); } if (biasData.shape[0] !== outputChannels) { throw new Error("FusedConv2D bias shape (" + biasData.shape + ") does not " + ("match the number of output channels (" + outputChannels + ")")); } biasId = biasData.id; } var filterHeight = convInfo.filterHeight; var filterWidth = convInfo.filterWidth; var padTop = convInfo.padInfo.top; var padRight = convInfo.padInfo.right; var padBottom = convInfo.padInfo.bottom; var padLeft = convInfo.padInfo.left; var dilationHeight = convInfo.dilationHeight; var dilationWidth = convInfo.dilationWidth; var strideHeight = convInfo.strideHeight; var strideWidth = convInfo.strideWidth; var inputChannels = convInfo.inChannels; var isSamePad = convInfo.padInfo.type === 'SAME' ? 1 : 0; var batchSize = convInfo.batchSize; var inHeight = convInfo.inHeight; var inWidth = convInfo.inWidth; if (dataFormat !== 'NHWC') { throw new Error("wasm backend FusedConv2D does not support dataFormat:'" + (dataFormat + "'. Please use 'NHWC'.")); } var out = backend.makeOutput(convInfo.outShape, 'float32'); var outId = backend.dataIdMap.get(out.dataId).id; var preluActivationWeightsId = preluActivationWeights == null ? 0 : backend.dataIdMap.get(preluActivationWeights.dataId).id; wasmFusedConv2d(xId, batchSize, inHeight, inWidth, filterId, filterHeight, filterWidth, biasId, padTop, padRight, padBottom, padLeft, isSamePad, dilationHeight, dilationWidth, strideHeight, strideWidth, inputChannels, outputChannels, fusedActivation, preluActivationWeightsId, leakyreluAlpha || 0, outId); return out; } var fusedConv2DConfig = { kernelName: tfjsCore.FusedConv2D, backendName: 'wasm', setupFunc: setup$h, kernelFunc: fusedConv2d }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFusedDepthwiseConv2d; function setup$i(backend) { wasmFusedDepthwiseConv2d = backend.wasm.cwrap(tfjsCore.FusedDepthwiseConv2D, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function fusedDepthwiseConv2d(args) { var inputs = args.inputs, attrs = args.attrs, backend = args.backend; var x = inputs.x, filter = inputs.filter, bias = inputs.bias, preluActivationWeights = inputs.preluActivationWeights; var strides = attrs.strides, pad = attrs.pad, dilations = attrs.dilations, dataFormat = attrs.dataFormat, dimRoundingMode = attrs.dimRoundingMode, activation = attrs.activation, leakyreluAlpha = attrs.leakyreluAlpha; var convInfo = tfjsCore.backend_util.computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, true /* depthwise */); var fusedActivation = FusableActivation[activation]; if (fusedActivation == null) { throw new Error(activation + " activation not yet supported for FusedDepthwiseConv2D " + "in the wasm backend."); } var xId = backend.dataIdMap.get(x.dataId).id; var filterId = backend.dataIdMap.get(filter.dataId).id; var outputChannels = convInfo.outChannels; var biasId = 0; if (bias != null) { var biasData = backend.dataIdMap.get(bias.dataId); if (biasData.shape.length !== 1) { throw new Error("FusedDepthwiseConv2D only supports rank-1 bias but got " + ("rank " + biasData.shape.length + ".")); } if (biasData.shape[0] !== outputChannels) { throw new Error("FusedDepthwiseConv2D bias shape (" + biasData.shape + ") does not " + ("match the number of output channels (" + outputChannels + ")")); } biasId = biasData.id; } var filterHeight = convInfo.filterHeight; var filterWidth = convInfo.filterWidth; var padTop = convInfo.padInfo.top; var padRight = convInfo.padInfo.right; var padBottom = convInfo.padInfo.bottom; var padLeft = convInfo.padInfo.left; var dilationHeight = convInfo.dilationHeight; var dilationWidth = convInfo.dilationWidth; var strideHeight = convInfo.strideHeight; var strideWidth = convInfo.strideWidth; var inputChannels = convInfo.inChannels; var isSamePad = convInfo.padInfo.type === 'SAME' ? 1 : 0; var batchSize = convInfo.batchSize; var inHeight = convInfo.inHeight; var inWidth = convInfo.inWidth; if (dataFormat !== 'NHWC') { throw new Error("wasm backend FusedDepthwiseConv2D does not support dataFormat:'" + (dataFormat + "'. Please use 'NHWC'.")); } var out = backend.makeOutput(convInfo.outShape, 'float32'); var outId = backend.dataIdMap.get(out.dataId).id; var preluActivationWeightsId = preluActivationWeights == null ? 0 : backend.dataIdMap.get(preluActivationWeights.dataId).id; wasmFusedDepthwiseConv2d(xId, batchSize, inHeight, inWidth, filterId, filterHeight, filterWidth, biasId, padTop, padRight, padBottom, padLeft, isSamePad, dilationHeight, dilationWidth, strideHeight, strideWidth, inputChannels, outputChannels, fusedActivation, preluActivationWeightsId, leakyreluAlpha || 0, outId); return out; } var fusedDepthwiseConv2DConfig = { kernelName: tfjsCore.FusedDepthwiseConv2D, backendName: 'wasm', setupFunc: setup$i, kernelFunc: fusedDepthwiseConv2d }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmGatherNd; function setup$j(backend) { wasmGatherNd = backend.wasm.cwrap(tfjsCore.GatherNd, null /*void*/, [ 'number', 'number', 'number', 'number', 'number', 'number', 'array', 'number' // outId ]); } function gatherNd(args) { var backend = args.backend, inputs = args.inputs; var params = inputs.params, indices = inputs.indices; var _a = tfjsCore.gather_util.prepareAndValidate(params, indices), resultShape = _a[0], numSlices = _a[1], sliceSize = _a[2], strides = _a[3]; var out = backend.makeOutput(resultShape, params.dtype); if (numSlices === 0) { return out; } var indicesShape = indices.shape; var sliceRank = indicesShape[indicesShape.length - 1]; var xData = backend.dataIdMap.get(params.dataId); var xId = xData.id; var indicesData = backend.dataIdMap.get(indices.dataId); var indicesId = indicesData.id; var stridesBytes = new Uint8Array(new Int32Array(strides).buffer); var outId = backend.dataIdMap.get(out.dataId).id; wasmGatherNd(xId, CppDType[params.dtype], indicesId, numSlices, sliceRank, sliceSize, stridesBytes, outId); return out; } var gatherNdConfig = { kernelName: tfjsCore.GatherNd, backendName: 'wasm', setupFunc: setup$j, kernelFunc: gatherNd }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmGather; function setup$k(backend) { wasmGather = backend.wasm.cwrap('Gather', null /*void*/, [ 'number', 'number', 'array', 'number', 'number', 'number', 'array', 'number' // outId ]); } function gatherV2(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var x = inputs.x, indices = inputs.indices; var axis = attrs.axis, batchDims = attrs.batchDims; // Throw error when any index is out of bound. var parsedAxis = tfjsCore.util.parseAxisParam(axis, x.shape)[0]; var indicesVals = backend.readSync(indices.dataId); var axisDim = x.shape[parsedAxis]; var _loop_1 = function (i) { var index = indicesVals[i]; tfjsCore.util.assert(index <= axisDim - 1 && index >= 0, function () { return "GatherV2: the index value " + index + " is not in [0, " + (axisDim - 1) + "]"; }); }; for (var i = 0; i < indicesVals.length; ++i) { _loop_1(i); } var shapeInfo = tfjsCore.backend_util.segment_util.collectGatherOpShapeInfo(x, indices, parsedAxis, batchDims); var flattenX = reshape({ inputs: { x: x }, attrs: { shape: [ shapeInfo.batchSize, shapeInfo.outerSize, shapeInfo.dimSize, shapeInfo.sliceSize ] }, backend: backend }); var indicesSize = tfjsCore.util.sizeFromShape(indices.shape); var flattenIndex = reshape({ inputs: { x: indices }, attrs: { shape: [shapeInfo.batchSize, indicesSize / shapeInfo.batchSize] }, backend: backend }); var flattenOutputShape = [ shapeInfo.batchSize, shapeInfo.outerSize, indicesSize / shapeInfo.batchSize, shapeInfo.sliceSize ]; var out = backend.makeOutput(flattenOutputShape, x.dtype); if (tfjsCore.util.sizeFromShape(x.shape) === 0) { return out; } var stridesSize = flattenX.shape.length - 1; var xData = backend.dataIdMap.get(flattenX.dataId); var xId = xData.id; var indicesData = backend.dataIdMap.get(flattenIndex.dataId); var indicesId = indicesData.id; var outId = backend.dataIdMap.get(out.dataId).id; var xStridesBytes = new Uint8Array(new Int32Array(tfjsCore.util.computeStrides(flattenX.shape)).buffer); var outStridesBytes = new Uint8Array(new Int32Array(tfjsCore.util.computeStrides(flattenOutputShape)).buffer); wasmGather(xId, CppDType[x.dtype], xStridesBytes, stridesSize, indicesId, shapeInfo.batchSize, outStridesBytes, outId); backend.disposeData(flattenX.dataId); backend.disposeData(flattenIndex.dataId); // reshape out.shape = shapeInfo.outputShape; return out; } var gatherV2Config = { kernelName: tfjsCore.GatherV2, backendName: 'wasm', setupFunc: setup$k, kernelFunc: gatherV2 }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var supportsFullBroadcast$1 = false; var greaterConfig = createBinaryKernelConfig(tfjsCore.Greater, supportsFullBroadcast$1, 'bool'); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var supportsFullBroadcast$2 = false; var greaterEqualConfig = createBinaryKernelConfig(tfjsCore.GreaterEqual, supportsFullBroadcast$2, 'bool'); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFunc$2; function setupFunc$1(backend) { wasmFunc$2 = backend.wasm.cwrap(tfjsCore.LeakyRelu, null /* void */, [ 'number', 'number', 'number', 'number', ]); } function leakyRelu(args) { var x = args.inputs.x, alpha = args.attrs.alpha, backend = args.backend; var xId = backend.dataIdMap.get(x.dataId).id; // According to TF API, LeakyRelu returns float32 when input is either float32 // or int32. var out = backend.makeOutput(x.shape, 'float32'); if (tfjsCore.util.sizeFromShape(x.shape) !== 0) { var outId = backend.dataIdMap.get(out.dataId).id; wasmFunc$2(xId, CppDType[x.dtype], alpha, outId); } return out; } var leakyReluConfig = { kernelName: tfjsCore.LeakyRelu, backendName: 'wasm', setupFunc: setupFunc$1, kernelFunc: leakyRelu, }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var supportsFullBroadcast$3 = false; var lessConfig = createBinaryKernelConfig(tfjsCore.Less, supportsFullBroadcast$3, 'bool'); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var supportsFullBroadcast$4 = false; var lessEqualConfig = createBinaryKernelConfig(tfjsCore.LessEqual, supportsFullBroadcast$4, 'bool'); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var logConfig = createUnaryKernelConfig(tfjsCore.Log); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var supportsFullBroadcast$5 = false; var logicalAndConfig = createBinaryKernelConfig(tfjsCore.LogicalAnd, supportsFullBroadcast$5, 'bool'); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmMax; function setup$l(backend) { wasmMax = backend.wasm.cwrap(tfjsCore.Max, null /*void*/, [ 'number', 'number', 'number', 'number', ]); } function max(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var axis = attrs.reductionIndices, keepDims = attrs.keepDims; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var inputId = xId; var input = x; var _a = permuteAxesAndTranspose(x, axis, backend), transposed = _a.transposed, axes = _a.axes, originalAxes = _a.originalAxes, inputWasTransposed = _a.inputWasTransposed; if (inputWasTransposed) { var transposedId = backend.dataIdMap.get(transposed.dataId).id; input = transposed; inputId = transposedId; } var inputRank = input.shape.length; tfjsCore.backend_util.assertAxesAreInnerMostDims('max', axes, inputRank); var _b = tfjsCore.backend_util.computeOutAndReduceShapes(input.shape, axes), outShape = _b[0], reduceShape = _b[1]; var reduceSize = tfjsCore.util.sizeFromShape(reduceShape); var out = backend.makeOutput(outShape, x.dtype); if (tfjsCore.util.sizeFromShape(input.shape) !== 0) { var outId = backend.dataIdMap.get(out.dataId).id; wasmMax(inputId, CppDType[x.dtype], reduceSize, outId); } if (inputWasTransposed) { // dispose of the transposed tensor. backend.disposeData(transposed.dataId); } if (keepDims) { // reshape var newShape = tfjsCore.backend_util.expandShapeToKeepDim(out.shape, originalAxes); out.shape = newShape; } return out; } var maxConfig = { kernelName: tfjsCore.Max, backendName: 'wasm', setupFunc: setup$l, kernelFunc: max }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var maximumConfig = createBinaryKernelConfig(tfjsCore.Maximum); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmMaxPool; function setup$m(backend) { wasmMaxPool = backend.wasm.cwrap(tfjsCore.MaxPool, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function maxPool(args) { var inputs = args.inputs, attrs = args.attrs, backend = args.backend; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; // TF API supports int32 input. CPU and WebGL backend also support int32 // input. WASM backend doesn't support it because it uses xnnpack which only // supports float32. // // Add the following assert only for the WASM backend instead of at core op // level. // // TODO: add support for int32 input. tfjsCore.util.assert(x.dtype === 'float32', function () { return "Error in MaxPool: only float32 input is supported. Got " + x.dtype + "."; }); var filterSize = attrs.filterSize, strides = attrs.strides, pad = attrs.pad, dimRoundingMode = attrs.dimRoundingMode; var convInfo = tfjsCore.backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode); var filterHeight = convInfo.filterHeight; var filterWidth = convInfo.filterWidth; var padTop = convInfo.padInfo.top; var padRight = convInfo.padInfo.right; var padBottom = convInfo.padInfo.bottom; var padLeft = convInfo.padInfo.left; var dilationHeight = convInfo.dilationHeight; var dilationWidth = convInfo.dilationWidth; var strideHeight = convInfo.strideHeight; var strideWidth = convInfo.strideWidth; var inputChannels = convInfo.inChannels; var outputChannels = convInfo.outChannels; if (convInfo.dataFormat !== 'channelsLast') { throw new Error("wasm backend does not support dataFormat:'" + (convInfo.dataFormat + "'. Please use 'channelsLast'.")); } var out = backend.makeOutput(convInfo.outShape, 'float32'); var outId = backend.dataIdMap.get(out.dataId).id; wasmMaxPool(xId, x.shape[0], x.shape[1], x.shape[2], filterHeight, filterWidth, padTop, padRight, padBottom, padLeft, dilationHeight, dilationWidth, strideHeight, strideWidth, inputChannels, outputChannels, outId); return out; } var maxPoolConfig = { kernelName: tfjsCore.MaxPool, backendName: 'wasm', setupFunc: setup$m, kernelFunc: maxPool }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmMean; function setup$n(backend) { wasmMean = backend.wasm.cwrap(tfjsCore.Mean, null /*void*/, ['number, number, number']); } function mean(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var axis = attrs.axis, keepDims = attrs.keepDims; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var inputId = xId; var input = x; var _a = permuteAxesAndTranspose(x, axis, backend), transposed = _a.transposed, axes = _a.axes, originalAxes = _a.originalAxes, inputWasTransposed = _a.inputWasTransposed; var reductionAxes = axes; if (inputWasTransposed) { var transposedId = backend.dataIdMap.get(transposed.dataId).id; if (transposedId !== xId) { // transpose was not a no-op. We will need to dispose of this // once we are done. input = transposed; inputId = transposedId; reductionAxes = tfjsCore.backend_util.getInnerMostAxes(reductionAxes.length, input.shape.length); } } tfjsCore.backend_util.assertAxesAreInnerMostDims('mean', reductionAxes, input.shape.length); var _b = tfjsCore.backend_util.computeOutAndReduceShapes(input.shape, reductionAxes), outShape = _b[0], reduceShape = _b[1]; var reduceSize = tfjsCore.util.sizeFromShape(reduceShape); var castedInput = input; if (input.dtype !== 'float32') { castedInput = cast({ backend: backend, inputs: { x: input }, attrs: { dtype: 'float32' } }); inputId = backend.dataIdMap.get(castedInput.dataId).id; } var out = backend.makeOutput(outShape, 'float32'); if (tfjsCore.util.sizeFromShape(input.shape) !== 0) { var outId = backend.dataIdMap.get(out.dataId).id; wasmMean(inputId, reduceSize, outId); } if (inputWasTransposed) { // dispose of the transposed tensor. backend.disposeData(transposed.dataId); } if (keepDims) { // reshape var newShape = tfjsCore.backend_util.expandShapeToKeepDim(out.shape, originalAxes); out.shape = newShape; } if (input.dtype !== 'float32') { backend.disposeData(castedInput.dataId); } return out; } var meanConfig = { kernelName: tfjsCore.Mean, backendName: 'wasm', setupFunc: setup$n, kernelFunc: mean }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmMin; function setup$o(backend) { wasmMin = backend.wasm.cwrap(tfjsCore.Min, null /*void*/, [ 'number', 'number', 'number', 'number', ]); } function min(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var axis = attrs.axis, keepDims = attrs.keepDims; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var inputId = xId; var input = x; var _a = permuteAxesAndTranspose(x, axis, backend), transposed = _a.transposed, axes = _a.axes, originalAxes = _a.originalAxes, inputWasTransposed = _a.inputWasTransposed; if (inputWasTransposed) { var transposedId = backend.dataIdMap.get(transposed.dataId).id; if (transposedId !== xId) { // transpose was not a no-op. We will need to dispose of this // once we are done. input = transposed; inputId = transposedId; } } var inputRank = input.shape.length; tfjsCore.backend_util.assertAxesAreInnerMostDims('min', axes, inputRank); var _b = tfjsCore.backend_util.computeOutAndReduceShapes(input.shape, axes), outShape = _b[0], reduceShape = _b[1]; var reduceSize = tfjsCore.util.sizeFromShape(reduceShape); var out = backend.makeOutput(outShape, input.dtype); if (tfjsCore.util.sizeFromShape(input.shape) !== 0) { var outId = backend.dataIdMap.get(out.dataId).id; wasmMin(inputId, CppDType[x.dtype], reduceSize, outId); } if (inputWasTransposed) { // dispose of the transposed tensor. backend.disposeData(transposed.dataId); } if (keepDims) { // reshape var newShape = tfjsCore.backend_util.expandShapeToKeepDim(out.shape, originalAxes); out.shape = newShape; } return out; } var minConfig = { kernelName: tfjsCore.Min, backendName: 'wasm', setupFunc: setup$o, kernelFunc: min }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var minimumConfig = createBinaryKernelConfig(tfjsCore.Minimum); /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ // Must match enum in MirrorPad.cc var MirrorPaddingMode; (function (MirrorPaddingMode) { MirrorPaddingMode[MirrorPaddingMode["reflect"] = 0] = "reflect"; MirrorPaddingMode[MirrorPaddingMode["symmetric"] = 1] = "symmetric"; })(MirrorPaddingMode || (MirrorPaddingMode = {})); var wasmMirrorPad; function setup$p(backend) { wasmMirrorPad = backend.wasm.cwrap(tfjsCore.MirrorPad, null /* void */, [ 'number', 'array', 'number', 'number', 'array', 'array', 'number', 'number', ]); } function mirrorPad(args) { var x = args.inputs.x, backend = args.backend, _a = args.attrs, paddings = _a.paddings, mode = _a.mode; var outShape = paddings.map(function (p, i) { return p[0] /* beforePad */ + x.shape[i] + p[1]; } /* afterPad */); var xId = backend.dataIdMap.get(x.dataId).id; var out = backend.makeOutput(outShape, x.dtype); var outId = backend.dataIdMap.get(out.dataId).id; var xShapeBytes = new Uint8Array(new Int32Array(x.shape).buffer); var prePaddingsFlat = paddings.map(function (padTuple) { return padTuple[0]; }); var postPaddingsFlat = paddings.map(function (padTuple) { return padTuple[1]; }); var prePaddingsBytes = new Uint8Array(new Int32Array(prePaddingsFlat).buffer); var postPaddingsBytes = new Uint8Array(new Int32Array(postPaddingsFlat).buffer); wasmMirrorPad(xId, xShapeBytes, x.shape.length, CppDType[x.dtype], prePaddingsBytes, postPaddingsBytes, MirrorPaddingMode[mode], outId); return out; } var mirrorPadConfig = { kernelName: tfjsCore.MirrorPad, backendName: 'wasm', kernelFunc: mirrorPad, setupFunc: setup$p }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var multiplyConfig = createBinaryKernelConfig(tfjsCore.Multiply); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var negConfig = createUnaryKernelConfig(tfjsCore.Neg); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ /** * Parse the result of the c++ method, which has the shape equivalent to * `Result`. */ function parseResultStruct(backend, resOffset) { var result = new Int32Array(backend.wasm.HEAPU8.buffer, resOffset, 4); var pSelectedIndices = result[0]; var selectedSize = result[1]; var pSelectedScores = result[2]; var pValidOutputs = result[3]; // Since the result was allocated on the heap, we have to delete it. backend.wasm._free(resOffset); return { pSelectedIndices: pSelectedIndices, selectedSize: selectedSize, pSelectedScores: pSelectedScores, pValidOutputs: pValidOutputs }; } /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFunc$3; function setup$q(backend) { wasmFunc$3 = backend.wasm.cwrap(tfjsCore.NonMaxSuppressionV3, 'number', // Result* [ 'number', 'number', 'number', 'number', 'number', ]); } function kernelFunc(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var iouThreshold = attrs.iouThreshold, maxOutputSize = attrs.maxOutputSize, scoreThreshold = attrs.scoreThreshold; var boxes = inputs.boxes, scores = inputs.scores; var boxesId = backend.dataIdMap.get(boxes.dataId).id; var scoresId = backend.dataIdMap.get(scores.dataId).id; var resOffset = wasmFunc$3(boxesId, scoresId, maxOutputSize, iouThreshold, scoreThreshold); var _a = parseResultStruct(backend, resOffset), pSelectedIndices = _a.pSelectedIndices, selectedSize = _a.selectedSize, pSelectedScores = _a.pSelectedScores, pValidOutputs = _a.pValidOutputs; // Since we are not using scores for V3, we have to delete it from the heap. backend.wasm._free(pSelectedScores); backend.wasm._free(pValidOutputs); var selectedIndicesTensor = backend.makeOutput([selectedSize], 'int32', pSelectedIndices); return selectedIndicesTensor; } var nonMaxSuppressionV3Config = { kernelName: tfjsCore.NonMaxSuppressionV3, backendName: 'wasm', setupFunc: setup$q, kernelFunc: kernelFunc, }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFunc$4; function setup$r(backend) { wasmFunc$4 = backend.wasm.cwrap(tfjsCore.NonMaxSuppressionV4, 'number', // Result* [ 'number', 'number', 'number', 'number', 'number', 'bool', ]); } function nonMaxSuppressionV4(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var iouThreshold = attrs.iouThreshold, maxOutputSize = attrs.maxOutputSize, scoreThreshold = attrs.scoreThreshold, padToMaxOutputSize = attrs.padToMaxOutputSize; var boxes = inputs.boxes, scores = inputs.scores; var boxesId = backend.dataIdMap.get(boxes.dataId).id; var scoresId = backend.dataIdMap.get(scores.dataId).id; var resOffset = wasmFunc$4(boxesId, scoresId, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize); var _a = parseResultStruct(backend, resOffset), pSelectedIndices = _a.pSelectedIndices, selectedSize = _a.selectedSize, pSelectedScores = _a.pSelectedScores, pValidOutputs = _a.pValidOutputs; // Since we are not using scores for V4, we have to delete it from the heap. backend.wasm._free(pSelectedScores); var selectedIndicesTensor = backend.makeOutput([selectedSize], 'int32', pSelectedIndices); var validOutputsTensor = backend.makeOutput([], 'int32', pValidOutputs); return [selectedIndicesTensor, validOutputsTensor]; } var nonMaxSuppressionV4Config = { kernelName: tfjsCore.NonMaxSuppressionV4, backendName: 'wasm', setupFunc: setup$r, kernelFunc: nonMaxSuppressionV4, }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFunc$5; function setup$s(backend) { wasmFunc$5 = backend.wasm.cwrap(tfjsCore.NonMaxSuppressionV5, 'number', // Result* [ 'number', 'number', 'number', 'number', 'number', 'number', ]); } function kernelFunc$1(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var iouThreshold = attrs.iouThreshold, maxOutputSize = attrs.maxOutputSize, scoreThreshold = attrs.scoreThreshold, softNmsSigma = attrs.softNmsSigma; var boxes = inputs.boxes, scores = inputs.scores; var boxesId = backend.dataIdMap.get(boxes.dataId).id; var scoresId = backend.dataIdMap.get(scores.dataId).id; var resOffset = wasmFunc$5(boxesId, scoresId, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma); var _a = parseResultStruct(backend, resOffset), pSelectedIndices = _a.pSelectedIndices, selectedSize = _a.selectedSize, pSelectedScores = _a.pSelectedScores, pValidOutputs = _a.pValidOutputs; // Since we are not using validOutputs for V5, we have to delete it from the // heap. backend.wasm._free(pValidOutputs); var selectedIndicesTensor = backend.makeOutput([selectedSize], 'int32', pSelectedIndices); var selectedScoresTensor = backend.makeOutput([selectedSize], 'float32', pSelectedScores); return [selectedIndicesTensor, selectedScoresTensor]; } var nonMaxSuppressionV5Config = { kernelName: tfjsCore.NonMaxSuppressionV5, backendName: 'wasm', setupFunc: setup$s, kernelFunc: kernelFunc$1, }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var supportsFullBroadcast$6 = false; var notEqualConfig = createBinaryKernelConfig(tfjsCore.NotEqual, supportsFullBroadcast$6, 'bool'); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmOneHot; function setup$t(backend) { wasmOneHot = backend.wasm.cwrap(tfjsCore.OneHot, null /* void */, [ 'number', 'number', 'number', 'number', 'number' // out_id ]); } function oneHot(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var indices = inputs.indices; var depth = attrs.depth, onValue = attrs.onValue, offValue = attrs.offValue; var out = backend.makeOutput(indices.shape.concat([depth]), 'int32'); var outId = backend.dataIdMap.get(out.dataId).id; var indicesData = backend.dataIdMap.get(indices.dataId); var indicesId = indicesData.id; wasmOneHot(indicesId, depth, onValue, offValue, outId); return out; } var oneHotConfig = { kernelName: tfjsCore.OneHot, backendName: 'wasm', setupFunc: setup$t, kernelFunc: oneHot, }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function onesLike(args) { var x = args.inputs.x, backend = args.backend; var out = backend.makeOutput(x.shape, x.dtype); var outVals = backend.typedArrayFromHeap(out); outVals.fill(1); return out; } var onesLikeConfig = { kernelName: tfjsCore.OnesLike, backendName: 'wasm', kernelFunc: onesLike, }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function pack(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var axis = attrs.axis; if (inputs.length === 1) { return expandDims({ inputs: { input: inputs[0] }, backend: backend, attrs: { dim: axis } }); } var shape = inputs[0].shape; var dtype = inputs[0].dtype; inputs.forEach(function (t) { tfjsCore.util.assertShapesMatch(shape, t.shape, 'All tensors passed to stack must have matching shapes'); tfjsCore.util.assert(dtype === t.dtype, function () { return 'All tensors passed to stack must have matching dtypes'; }); }); var intermediateTensorInfos = []; var expandedTensors = inputs.map(function (t) { var expandedT = expandDims({ inputs: { input: t }, backend: backend, attrs: { dim: axis } }); intermediateTensorInfos.push(expandedT); return expandedT; }); var result = concat({ inputs: expandedTensors, backend: backend, attrs: { axis: axis } }); intermediateTensorInfos.forEach(function (t) { return backend.disposeData(t.dataId); }); return result; } var packConfig = { kernelName: tfjsCore.Pack, backendName: 'wasm', kernelFunc: pack }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmPadV2; function setup$u(backend) { wasmPadV2 = backend.wasm.cwrap(tfjsCore.PadV2, null /* void */, [ 'number', 'array', 'number', 'number', 'array', 'array', 'number', 'number', ]); } function pad(args) { var x = args.inputs.x, backend = args.backend, _a = args.attrs, paddings = _a.paddings, constantValue = _a.constantValue; var outShape = paddings.map(function (p, i) { return p[0] /* beforePad */ + x.shape[i] + p[1]; } /* afterPad */); if (tfjsCore.util.sizeFromShape(x.shape) === 0) { // Short-circuit the computation, since x doesn't have value, only // the shape is used to compute output shape to pad. return fill({ backend: backend, attrs: { shape: outShape, value: constantValue, dtype: x.dtype } }); } var xId = backend.dataIdMap.get(x.dataId).id; var out = backend.makeOutput(outShape, x.dtype); var outTensorData = backend.dataIdMap.get(out.dataId); var outId = outTensorData.id; var xShapeBytes = new Uint8Array(new Int32Array(x.shape).buffer); var prePaddingsFlat = paddings.map(function (padTuple) { return padTuple[0]; }); var postPaddingsFlat = paddings.map(function (padTuple) { return padTuple[1]; }); var prePaddingsBytes = new Uint8Array(new Int32Array(prePaddingsFlat).buffer); var postPaddingsBytes = new Uint8Array(new Int32Array(postPaddingsFlat).buffer); wasmPadV2(xId, xShapeBytes, x.shape.length, CppDType[x.dtype], prePaddingsBytes, postPaddingsBytes, constantValue, outId); return out; } var padV2Config = { kernelName: tfjsCore.PadV2, backendName: 'wasm', kernelFunc: pad, setupFunc: setup$u }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var powConfig = createBinaryKernelConfig(tfjsCore.Pow); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmPrelu; function setup$v(backend) { wasmPrelu = backend.wasm.cwrap(tfjsCore.Prelu, null /* void */, [ 'number', 'number', 'number' // out_id ]); } function prelu(args) { var inputs = args.inputs, backend = args.backend; var x = inputs.x, alpha = inputs.alpha; var xId = backend.dataIdMap.get(x.dataId).id; var weightsId = backend.dataIdMap.get(alpha.dataId).id; var inputId = xId; var input = x; var castedInput = input; if (input.dtype !== 'float32') { castedInput = cast({ backend: backend, inputs: { x: x }, attrs: { dtype: 'float32' } }); inputId = backend.dataIdMap.get(castedInput.dataId).id; } var out = backend.makeOutput(x.shape, 'float32'); var outId = backend.dataIdMap.get(out.dataId).id; wasmPrelu(inputId, weightsId, outId); if (input.dtype !== 'float32') { backend.disposeData(castedInput.dataId); } return out; } var preluConfig = { kernelName: tfjsCore.Prelu, backendName: 'wasm', setupFunc: setup$v, kernelFunc: prelu }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmProd; function setup$w(backend) { wasmProd = backend.wasm.cwrap(tfjsCore.Prod, null /*void*/, [ 'number', 'number', 'number', 'number' ]); } function prod(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var axis = attrs.axis, keepDims = attrs.keepDims; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var inputId = xId; var input = x; var _a = permuteAxesAndTranspose(x, axis, backend), transposed = _a.transposed, axes = _a.axes, originalAxes = _a.originalAxes, inputWasTransposed = _a.inputWasTransposed; var reductionAxes = axes; if (inputWasTransposed) { var transposedId = backend.dataIdMap.get(transposed.dataId).id; if (transposedId !== xId) { // transpose was not a no-op. We will need to dispose of this // once we are done. input = transposed; inputId = transposedId; reductionAxes = tfjsCore.backend_util.getInnerMostAxes(reductionAxes.length, input.shape.length); } } tfjsCore.backend_util.assertAxesAreInnerMostDims('prod', reductionAxes, input.shape.length); var _b = tfjsCore.backend_util.computeOutAndReduceShapes(input.shape, reductionAxes), outShape = _b[0], reduceShape = _b[1]; var reduceSize = tfjsCore.util.sizeFromShape(reduceShape); var out = backend.makeOutput(outShape, input.dtype); if (tfjsCore.util.sizeFromShape(input.shape) !== 0) { var outId = backend.dataIdMap.get(out.dataId).id; wasmProd(inputId, reduceSize, CppDType[out.dtype], outId); } if (inputWasTransposed) { // dispose of the transposed tensor. backend.disposeData(transposed.dataId); } if (keepDims) { // reshape var newShape = tfjsCore.backend_util.expandShapeToKeepDim(out.shape, originalAxes); out.shape = newShape; } return out; } var prodConfig = { kernelName: tfjsCore.Prod, backendName: 'wasm', setupFunc: setup$w, kernelFunc: prod }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var range = function (args) { var backend = args.backend, attrs = args.attrs; var start = attrs.start, stop = attrs.stop, step = attrs.step, dtype = attrs.dtype; var values = rangeImpl(start, stop, step, dtype); var out = backend.makeOutput([values.length], dtype); var outVals = backend.typedArrayFromHeap(out); outVals.set(values); return out; }; var rangeConfig = { kernelName: tfjsCore.Range, backendName: 'wasm', kernelFunc: range }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var realDivConfig = createBinaryKernelConfig(tfjsCore.RealDiv); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var reluConfig = createUnaryKernelConfig(tfjsCore.Relu); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var relu6Config = createUnaryKernelConfig(tfjsCore.Relu6); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmResizeBilinear; function setup$x(backend) { wasmResizeBilinear = backend.wasm.cwrap(tfjsCore.ResizeBilinear, null /*void*/, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number' // outId ]); } function resizeBilinear(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var images = inputs.images; var alignCorners = attrs.alignCorners, halfPixelCenters = attrs.halfPixelCenters, size = attrs.size; var newHeight = size[0], newWidth = size[1]; var _a = images.shape, batch = _a[0], oldHeight = _a[1], oldWidth = _a[2], numChannels = _a[3]; var outShape = [batch, newHeight, newWidth, numChannels]; var xData = backend.dataIdMap.get(images.dataId); var castedData; if (xData.dtype !== 'float32') { castedData = cast({ backend: backend, inputs: { x: images }, attrs: { dtype: 'float32' } }); xData = backend.dataIdMap.get(castedData.dataId); } var xId = xData.id; var out = backend.makeOutput(outShape, 'float32'); if (tfjsCore.util.sizeFromShape(images.shape) === 0) { return out; } var outId = backend.dataIdMap.get(out.dataId).id; wasmResizeBilinear(xId, batch, oldHeight, oldWidth, numChannels, newHeight, newWidth, alignCorners ? 1 : 0, halfPixelCenters ? 1 : 0, outId); if (castedData != null) { backend.disposeData(castedData.dataId); } return out; } var resizeBilinearConfig = { kernelName: tfjsCore.ResizeBilinear, backendName: 'wasm', setupFunc: setup$x, kernelFunc: resizeBilinear }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmReverse; function setup$y(backend) { wasmReverse = backend.wasm.cwrap(tfjsCore.Reverse, null, [ 'number', 'array', 'number', 'array', 'number', 'number' // out_id ]); } function reverse(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var x = inputs.x; var dims = attrs.dims; var axes = tfjsCore.util.parseAxisParam(dims, x.shape); if (x.shape.length === 0) { return identity({ inputs: { x: x }, backend: backend }); } var out = backend.makeOutput(x.shape, x.dtype); var xId = backend.dataIdMap.get(x.dataId).id; var outId = backend.dataIdMap.get(out.dataId).id; var axesBytes = new Uint8Array(new Int32Array(axes).buffer); var outShapeBytes = new Uint8Array(new Int32Array(x.shape).buffer); wasmReverse(xId, axesBytes, axes.length, outShapeBytes, x.shape.length, outId); var reshaped = reshape({ inputs: { x: out }, attrs: { shape: x.shape }, backend: backend }); backend.disposeData(out.dataId); return reshaped; } var reverseConfig = { kernelName: tfjsCore.Reverse, backendName: 'wasm', kernelFunc: reverse, setupFunc: setup$y }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmRotate; function setup$z(backend) { wasmRotate = backend.wasm.cwrap(tfjsCore.RotateWithOffset, null /* void */, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'array', 'number', 'number', ]); } function rotateWithOffset(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var image = inputs.image; var radians = attrs.radians, fillValue = attrs.fillValue, center = attrs.center; var out = backend.makeOutput(image.shape, image.dtype); var imageId = backend.dataIdMap.get(image.dataId).id; var outId = backend.dataIdMap.get(out.dataId).id; var _a = image.shape, batch = _a[0], imageHeight = _a[1], imageWidth = _a[2], numChannels = _a[3]; var _b = tfjsCore.backend_util.getImageCenter(center, imageHeight, imageWidth), centerX = _b[0], centerY = _b[1]; var fillIsBlack = fillValue === 0; var fullOpacityValue = 255; var fillValues = typeof fillValue === 'number' ? [fillValue, fillValue, fillValue, fillIsBlack ? 0 : fullOpacityValue] : fillValue.concat([fullOpacityValue]); var fillBytes = new Uint8Array(new Int32Array(fillValues).buffer); wasmRotate(imageId, batch, imageHeight, imageWidth, numChannels, radians, centerX, centerY, fillBytes, fillValues.length, outId); return out; } var rotateWithOffsetConfig = { kernelName: tfjsCore.RotateWithOffset, backendName: 'wasm', kernelFunc: rotateWithOffset, setupFunc: setup$z }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var roundConfig = createUnaryKernelConfig(tfjsCore.Round); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var rsqrtConfig = createUnaryKernelConfig(tfjsCore.Rsqrt); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmScatterNd; function setup$A(backend) { wasmScatterNd = backend.wasm.cwrap(tfjsCore.ScatterNd, null /*void*/, [ 'number', 'number', 'number', 'number', 'number', 'number', 'array', 'number', 'number' // outId ]); } function scatterNd(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var indices = inputs.indices, updates = inputs.updates; var shape = attrs.shape; var out = backend.makeOutput(shape, updates.dtype); if (tfjsCore.util.sizeFromShape(shape) === 0) { return out; } var _a = tfjsCore.scatter_util.calculateShapes(updates, indices, shape), sliceRank = _a.sliceRank, numUpdates = _a.numUpdates, sliceSize = _a.sliceSize, strides = _a.strides, outputSize = _a.outputSize; var indicesData = backend.dataIdMap.get(indices.dataId); var indicesId = indicesData.id; var updatesData = backend.dataIdMap.get(updates.dataId); var updatesId = updatesData.id; var stridesBytes = new Uint8Array(new Int32Array(strides).buffer); var outId = backend.dataIdMap.get(out.dataId).id; wasmScatterNd(indicesId, updatesId, CppDType[updates.dtype], sliceRank, numUpdates, sliceSize, stridesBytes, outputSize, outId); return out; } var scatterNdConfig = { kernelName: tfjsCore.ScatterNd, backendName: 'wasm', setupFunc: setup$A, kernelFunc: scatterNd }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmSelect; function setup$B(backend) { wasmSelect = backend.wasm.cwrap('SelectV2', null, [ 'number', 'number', 'number', 'number', 'number', ]); } function select(args) { var inputs = args.inputs, backend = args.backend; var condition = inputs.condition, t = inputs.t, e = inputs.e; var conditionId = backend.dataIdMap.get(condition.dataId).id; var tId = backend.dataIdMap.get(t.dataId).id; var eId = backend.dataIdMap.get(e.dataId).id; var out = backend.makeOutput(t.shape, t.dtype); var outId = backend.dataIdMap.get(out.dataId).id; var cRank = condition.shape.length; var tRank = t.shape.length; var offset = cRank === 0 || cRank > 1 || tRank === 1 ? 1 : tfjsCore.util.sizeFromShape(t.shape.slice(1)); wasmSelect(conditionId, tId, eId, offset, outId); return out; } var selectConfig = { kernelName: tfjsCore.Select, backendName: 'wasm', kernelFunc: select, setupFunc: setup$B }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFunc$6; function setup$C(backend) { wasmFunc$6 = backend.wasm.cwrap(tfjsCore.Sigmoid, null /* void */, ['number', 'number']); } function sigmoid(args) { var backend = args.backend, x = args.inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var out = backend.makeOutput(x.shape, x.dtype); var outId = backend.dataIdMap.get(out.dataId).id; // Short-circuit zero-sized tensors. if (tfjsCore.util.sizeFromShape(out.shape) === 0) { return out; } wasmFunc$6(xId, outId); return out; } var sigmoidConfig = { kernelName: 'Sigmoid', backendName: 'wasm', setupFunc: setup$C, kernelFunc: sigmoid }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var sinConfig = createUnaryKernelConfig(tfjsCore.Sin); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmFunc$7; function setup$D(backend) { wasmFunc$7 = backend.wasm.cwrap(tfjsCore.Softmax, null /* void */, [ 'number', 'number', 'number', 'number' // batch ]); } function softmax(args) { var backend = args.backend, logits = args.inputs.logits, dim = args.attrs.dim; var xId = backend.dataIdMap.get(logits.dataId).id; var out = backend.makeOutput(logits.shape, logits.dtype); var outId = backend.dataIdMap.get(out.dataId).id; var channels = logits.shape[dim]; var batch = tfjsCore.util.sizeFromShape(logits.shape) / channels; // Short-circuit zero-sized tensors. if (tfjsCore.util.sizeFromShape(out.shape) === 0) { return out; } wasmFunc$7(xId, outId, channels, batch); return out; } var softmaxConfig = { kernelName: tfjsCore.Softmax, backendName: 'wasm', setupFunc: setup$D, kernelFunc: softmax }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function spaceToBatchND(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var x = inputs.x; var blockShape = attrs.blockShape, paddings = attrs.paddings; var prod = tfjsCore.util.sizeFromShape(blockShape); var completePaddings = [[0, 0]]; completePaddings.push.apply(completePaddings, paddings); for (var i = 1 + blockShape.length; i < x.shape.length; ++i) { completePaddings.push([0, 0]); } var paddedX = padV2Config.kernelFunc({ inputs: { x: x }, backend: backend, attrs: { paddings: completePaddings, constantValue: 0 } }); var reshapedPaddedShape = tfjsCore.backend_util.getReshaped(paddedX.shape, blockShape, prod, false); var permutedReshapedPaddedPermutation = tfjsCore.backend_util.getPermuted(reshapedPaddedShape.length, blockShape.length, false); var flattenShape = tfjsCore.backend_util.getReshapedPermuted(paddedX.shape, blockShape, prod, false); var reshapeInputs = { x: paddedX }; var reshapeAttrs = { shape: reshapedPaddedShape }; var paddedXReshaped = reshape({ inputs: reshapeInputs, backend: backend, attrs: reshapeAttrs }); var transposeInputs = { x: paddedXReshaped }; var transposeAttrs = { perm: permutedReshapedPaddedPermutation }; var paddedXT = transpose({ inputs: transposeInputs, backend: backend, attrs: transposeAttrs }); var resultReshapeInputs = { x: paddedXT }; var resultReshapeAttrs = { shape: flattenShape }; var result = reshape({ inputs: resultReshapeInputs, backend: backend, attrs: resultReshapeAttrs }); backend.disposeData(paddedX.dataId); backend.disposeData(paddedXReshaped.dataId); backend.disposeData(paddedXT.dataId); return result; } var spaceToBatchNDConfig = { kernelName: tfjsCore.SpaceToBatchND, backendName: 'wasm', kernelFunc: spaceToBatchND }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmSparseFillEmptyRows; function setup$E(backend) { wasmSparseFillEmptyRows = backend.wasm.cwrap('SparseFillEmptyRows', 'number', [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function sparseFillEmptyRows(args) { var backend = args.backend, inputs = args.inputs; var indices = inputs.indices, values = inputs.values, denseShape = inputs.denseShape, defaultValue = inputs.defaultValue; var indicesCount = indices.shape[0]; var rank = indices.shape[1]; var denseRows = backend.readSync(denseShape.dataId)[0]; // Set output size to maximum possible and resize later (actual result // might be smaller). var maxOutputIndicesShape = [indicesCount + denseRows, rank]; var indicesId = backend.dataIdMap.get(indices.dataId).id; var valuesId = backend.dataIdMap.get(values.dataId).id; var defaultValueId = backend.dataIdMap.get(defaultValue.dataId).id; var outputIndices = backend.makeOutput(maxOutputIndicesShape, indices.dtype); var outputIndicesId = backend.dataIdMap.get(outputIndices.dataId).id; var outputValues = backend.makeOutput(maxOutputIndicesShape.slice(0, 1), values.dtype); var outputValuesId = backend.dataIdMap.get(outputValues.dataId).id; var emptyRowIndicator = backend.makeOutput([denseRows], 'bool'); var emptyRowIndicatorId = backend.dataIdMap.get(emptyRowIndicator.dataId).id; var reverseIndexMap = backend.makeOutput([indicesCount], indices.dtype); var reverseIndexMapId = backend.dataIdMap.get(reverseIndexMap.dataId).id; var exceptionValues = backend.makeOutput([4], 'int32'); var exceptionValuesId = backend.dataIdMap.get(exceptionValues.dataId).id; var outputRows = wasmSparseFillEmptyRows(indicesId, valuesId, CppDType[values.dtype], indicesCount, denseRows, rank, defaultValueId, outputIndicesId, outputValuesId, emptyRowIndicatorId, reverseIndexMapId, exceptionValuesId); var exceptionValuesArray = backend.readSync(exceptionValues.dataId); var exceptionMessage; switch (exceptionValuesArray[0]) { case 1: { exceptionMessage = tfjsCore.backend_util.getSparseFillEmptyRowsIndicesDenseShapeMismatch(exceptionValuesArray[1]); break; } case 2: { exceptionMessage = tfjsCore.backend_util.getSparseFillEmptyRowsNegativeIndexErrorMessage(exceptionValuesArray[1], exceptionValuesArray[2]); break; } case 3: exceptionMessage = tfjsCore.backend_util.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(exceptionValuesArray[1], exceptionValuesArray[2], exceptionValuesArray[3]); break; default: exceptionMessage = ''; } backend.disposeData(exceptionValues.dataId); if (exceptionMessage) { backend.disposeData(outputIndices.dataId); backend.disposeData(outputValues.dataId); backend.disposeData(emptyRowIndicator.dataId); backend.disposeData(reverseIndexMap.dataId); throw new Error(exceptionMessage); } var resizedIndices = outputIndices; var resizedValues = outputValues; // Overestimated output size. if (outputRows !== maxOutputIndicesShape[0]) { resizedIndices = slice({ inputs: { x: outputIndices }, attrs: { begin: 0, size: [outputRows, rank] }, backend: backend }); resizedValues = slice({ inputs: { x: outputValues }, attrs: { begin: 0, size: outputRows }, backend: backend }); backend.disposeData(outputIndices.dataId); backend.disposeData(outputValues.dataId); } return [resizedIndices, resizedValues, emptyRowIndicator, reverseIndexMap]; } var sparseFillEmptyRowsConfig = { kernelName: tfjsCore.SparseFillEmptyRows, backendName: 'wasm', setupFunc: setup$E, kernelFunc: sparseFillEmptyRows }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmSparseReshape; function setup$F(backend) { wasmSparseReshape = backend.wasm.cwrap(tfjsCore.SparseReshape, null /*void*/, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function sparseReshape(args) { var backend = args.backend, inputs = args.inputs; var inputIndices = inputs.inputIndices, inputShape = inputs.inputShape, newShape = inputs.newShape; if (inputIndices.shape.length !== 2) { throw new Error("Input indices should be a matrix but received shape\n " + inputIndices.shape); } if (inputShape.shape.length !== 1) { throw new Error("Input shape should be a vector but received shape\n " + inputShape.shape); } if (newShape.shape.length !== 1) { throw new Error("Target shape should be a vector but received shape " + newShape.shape); } var inputIndicesId = backend.dataIdMap.get(inputIndices.dataId).id; var inputShapeId = backend.dataIdMap.get(inputShape.dataId).id; var newShapeId = backend.dataIdMap.get(newShape.dataId).id; var nnz = inputIndices.shape[0]; var outputRank = tfjsCore.util.sizeFromShape(newShape.shape); var newIndices = backend.makeOutput([nnz, outputRank], inputIndices.dtype); var newIndicesId = backend.dataIdMap.get(newIndices.dataId).id; var outputShape = backend.makeOutput([outputRank], newShape.dtype); var outputShapeId = backend.dataIdMap.get(outputShape.dataId).id; var exceptionValues = backend.makeOutput([3], 'int32'); var exceptionValuesId = backend.dataIdMap.get(exceptionValues.dataId).id; wasmSparseReshape(inputIndicesId, inputShapeId, newShapeId, nnz, newIndicesId, outputShapeId, exceptionValuesId); var exceptionValuesArray = backend.readSync(exceptionValues.dataId); var exceptionMessage; switch (exceptionValuesArray[0]) { case 0: { exceptionMessage = tfjsCore.backend_util.getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(exceptionValuesArray[1], exceptionValuesArray[2]); break; } case 1: { exceptionMessage = tfjsCore.backend_util.getSparseReshapeNegativeOutputDimErrorMessage(exceptionValuesArray[1], exceptionValuesArray[2]); break; } case 2: exceptionMessage = tfjsCore.backend_util.getSparseReshapeEmptyTensorZeroOutputDimErrorMessage(); break; case 3: { var inputShapeValues = Array.from(backend.readSync(inputShape.dataId)), outputShapeValues = Array.from(backend.readSync(outputShape.dataId)); exceptionMessage = tfjsCore.backend_util.getSparseReshapeInputOutputMultipleErrorMessage(inputShapeValues, outputShapeValues); break; } case 4: { var inputShapeValues = Array.from(backend.readSync(inputShape.dataId)), outputShapeValues = Array.from(backend.readSync(outputShape.dataId)); exceptionMessage = tfjsCore.backend_util.getSparseReshapeInputOutputMismatchErrorMessage(inputShapeValues, outputShapeValues); break; } default: exceptionMessage = ''; } backend.disposeData(exceptionValues.dataId); if (exceptionMessage) { backend.disposeData(newIndices.dataId); backend.disposeData(outputShape.dataId); throw new Error(exceptionMessage); } return [newIndices, outputShape]; } var sparseReshapeConfig = { kernelName: tfjsCore.SparseReshape, backendName: 'wasm', setupFunc: setup$F, kernelFunc: sparseReshape }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmSparseSegmentReduction; function setup$G(backend) { wasmSparseSegmentReduction = backend.wasm.cwrap('SparseSegmentReduction', null /*void*/, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', ]); } function sparseSegmentReduction(args, isMean) { var backend = args.backend, inputs = args.inputs; var data = inputs.data, indices = inputs.indices, segmentIds = inputs.segmentIds; var numIndices = indices.shape[0]; var segmentIdsBack = backend.readSync(segmentIds.dataId, numIndices - 1, numIndices)[0]; var lastSegmentIdPlusOne = numIndices > 0 ? segmentIdsBack + 1 : 0; var outputRows = lastSegmentIdPlusOne; if (outputRows < 0) { throw (new Error(tfjsCore.backend_util .getSparseSegmentReductionNegativeSegmentIdsErrorMessage())); } var outputShape = data.shape.slice(); outputShape[0] = outputRows; var dataId = backend.dataIdMap.get(data.dataId).id; var indicesId = backend.dataIdMap.get(indices.dataId).id; var segmentIdsId = backend.dataIdMap.get(segmentIds.dataId).id; var output = backend.makeOutput(outputShape, data.dtype); var outputId = backend.dataIdMap.get(output.dataId).id; var exceptionValues = backend.makeOutput([4], 'int32'); var exceptionValuesId = backend.dataIdMap.get(exceptionValues.dataId).id; wasmSparseSegmentReduction(dataId, CppDType[data.dtype], data.shape[0], indicesId, segmentIdsId, outputId, exceptionValuesId, isMean, 0); var exceptionValuesArray = backend.readSync(exceptionValues.dataId); var exceptionMessage; switch (exceptionValuesArray[0]) { case 0: { exceptionMessage = tfjsCore.backend_util .getSparseSegmentReductionNegativeSegmentIdsErrorMessage(); break; } case 1: { exceptionMessage = tfjsCore.backend_util .getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage(); break; } case 2: exceptionMessage = tfjsCore.backend_util.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(exceptionValuesArray[1], exceptionValuesArray[2]); break; case 3: exceptionMessage = tfjsCore.backend_util.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(exceptionValuesArray[1], exceptionValuesArray[2], exceptionValuesArray[3]); break; default: exceptionMessage = ''; } backend.disposeData(exceptionValues.dataId); if (exceptionMessage) { backend.disposeData(output.dataId); throw new Error(exceptionMessage); } return output; } /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function sparseSegmentMean(args) { return sparseSegmentReduction(args, true); } var sparseSegmentMeanConfig = { kernelName: tfjsCore.SparseSegmentMean, backendName: 'wasm', setupFunc: setup$G, kernelFunc: sparseSegmentMean }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function sparseSegmentSum(args) { return sparseSegmentReduction(args, false); } var sparseSegmentSumConfig = { kernelName: tfjsCore.SparseSegmentSum, backendName: 'wasm', setupFunc: setup$G, kernelFunc: sparseSegmentSum }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function splitV(args) { var inputs = args.inputs, attrs = args.attrs, backend = args.backend; var x = inputs.x; var numOrSizeSplits = attrs.numOrSizeSplits, axis = attrs.axis; var $axis = tfjsCore.util.parseAxisParam(axis, x.shape)[0]; var splitSizes = tfjsCore.backend_util.prepareSplitSize(x, numOrSizeSplits, $axis); var begin = new Array(x.shape.length).fill(0); var size = x.shape.slice(); return splitSizes.map(function (s) { var xSliceSize = size.slice(); xSliceSize[$axis] = s; var xSlice = slice({ inputs: { x: x }, attrs: { begin: begin, size: xSliceSize }, backend: backend }); begin[$axis] += s; return xSlice; }); } var splitVConfig = { kernelName: tfjsCore.SplitV, backendName: 'wasm', kernelFunc: splitV }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var sqrtConfig = createUnaryKernelConfig(tfjsCore.Sqrt); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var squareConfig = createUnaryKernelConfig(tfjsCore.Square); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var squaredDifferenceConfig = createBinaryKernelConfig(tfjsCore.SquaredDifference); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmStep; function setup$H(backend) { wasmStep = backend.wasm.cwrap(tfjsCore.Step, null /*void*/, [ 'number', 'number', 'number', 'number', ]); } function step(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var alpha = attrs.alpha; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var out = backend.makeOutput(x.shape, x.dtype); var outId = backend.dataIdMap.get(out.dataId).id; wasmStep(xId, alpha, CppDType[x.dtype], outId); return out; } var stepConfig = { kernelName: tfjsCore.Step, backendName: 'wasm', setupFunc: setup$H, kernelFunc: step }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmStridedSlice; function setup$I(backend) { wasmStridedSlice = backend.wasm.cwrap(tfjsCore.StridedSlice, null /*void*/, [ 'number', 'array', 'number', 'array', 'array', 'array', 'array', 'array', 'number', 'number', ]); } function stridedSlice(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var x = inputs.x; var begin = attrs.begin, end = attrs.end, strides = attrs.strides, beginMask = attrs.beginMask, endMask = attrs.endMask, ellipsisMask = attrs.ellipsisMask, newAxisMask = attrs.newAxisMask, shrinkAxisMask = attrs.shrinkAxisMask; var _a = tfjsCore.slice_util.sliceInfo(x.shape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask), finalShapeSparse = _a.finalShapeSparse, finalShape = _a.finalShape, isIdentity = _a.isIdentity, sliceDim0 = _a.sliceDim0, isSimpleSlice = _a.isSimpleSlice, $begin = _a.begin, $end = _a.end, $strides = _a.strides; var result; if (isIdentity) { // Optimization #1, slice is a no-op plus reshape result = reshape({ inputs: { x: x }, backend: backend, attrs: { shape: finalShape } }); } else if (sliceDim0 || isSimpleSlice) { // Optimization #2, slice is memory contiguous (only occurs in dim 0) tfjsCore.util.assert(x.shape.length >= 1, function () { return "Input must have rank at least 1, got: " + x.shape.length; }); var size = tfjsCore.slice_util.computeOutShape($begin, $end, $strides); // To tolerate begin[0] > end[0] (a 0-output slice), we min(begin, end). var sliced = slice({ inputs: { x: x }, backend: backend, attrs: { begin: $begin, size: size } }); result = reshape({ inputs: { x: sliced }, backend: backend, attrs: { shape: finalShape } }); backend.disposeData(sliced.dataId); } else { var out = backend.makeOutput(finalShapeSparse, 'float32'); var xId = backend.dataIdMap.get(x.dataId).id; var xStridesBytes = new Uint8Array(new Int32Array(tfjsCore.util.computeStrides(x.shape)).buffer); var beginBytes = new Uint8Array(new Int32Array($begin).buffer); var endBytes = new Uint8Array(new Int32Array($end).buffer); var stridesBytes = new Uint8Array(new Int32Array($strides).buffer); var outputShapeBytes = new Uint8Array(new Int32Array(finalShapeSparse).buffer); var outStridesBytes = new Uint8Array(new Int32Array(tfjsCore.util.computeStrides(finalShapeSparse)).buffer); var outId = backend.dataIdMap.get(out.dataId).id; wasmStridedSlice(xId, xStridesBytes, x.shape.length, beginBytes, endBytes, stridesBytes, outputShapeBytes, outStridesBytes, finalShapeSparse.length, outId); result = reshape({ inputs: { x: out }, backend: backend, attrs: { shape: finalShape } }); backend.disposeData(out.dataId); } return result; } var stridedSliceConfig = { kernelName: tfjsCore.StridedSlice, backendName: 'wasm', setupFunc: setup$I, kernelFunc: stridedSlice }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var subConfig = createBinaryKernelConfig(tfjsCore.Sub); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmSum; function setup$J(backend) { wasmSum = backend.wasm.cwrap(tfjsCore.Sum, null /*void*/, [ 'number', 'number', 'number', 'number', ]); } function sum(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var axis = attrs.axis, keepDims = attrs.keepDims; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var inputId = xId; var input = x; var _a = permuteAxesAndTranspose(x, axis, backend), transposed = _a.transposed, axes = _a.axes, originalAxes = _a.originalAxes, inputWasTransposed = _a.inputWasTransposed; var reductionAxes = axes; if (inputWasTransposed) { var transposedId = backend.dataIdMap.get(transposed.dataId).id; if (transposedId !== xId) { // transpose was not a no-op. We will need to dispose of this // once we are done. input = transposed; inputId = transposedId; reductionAxes = tfjsCore.backend_util.getInnerMostAxes(reductionAxes.length, input.shape.length); } } tfjsCore.backend_util.assertAxesAreInnerMostDims('sum', reductionAxes, input.shape.length); var _b = tfjsCore.backend_util.computeOutAndReduceShapes(input.shape, reductionAxes), outShape = _b[0], reduceShape = _b[1]; var reduceSize = tfjsCore.util.sizeFromShape(reduceShape); var out = backend.makeOutput(outShape, input.dtype); if (tfjsCore.util.sizeFromShape(input.shape) !== 0) { var outId = backend.dataIdMap.get(out.dataId).id; wasmSum(inputId, reduceSize, CppDType[out.dtype], outId); } if (inputWasTransposed) { // dispose of the transposed tensor. backend.disposeData(transposed.dataId); } if (keepDims) { // reshape var newShape = tfjsCore.backend_util.expandShapeToKeepDim(out.shape, originalAxes); out.shape = newShape; } return out; } var sumConfig = { kernelName: tfjsCore.Sum, backendName: 'wasm', setupFunc: setup$J, kernelFunc: sum }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var tanConfig = createUnaryKernelConfig(tfjsCore.Tan); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var tanhConfig = createUnaryKernelConfig(tfjsCore.Tanh); /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmTile; function setup$K(backend) { wasmTile = backend.wasm.cwrap(tfjsCore.Tile, null /* void */, [ 'number', 'array', 'number', 'array', 'number', 'number' // out_id ]); } function tile(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var x = inputs.x; var xId = backend.dataIdMap.get(x.dataId).id; var reps = attrs.reps; var newShape = new Array(x.shape.length); for (var i = 0; i < newShape.length; i++) { newShape[i] = x.shape[i] * reps[i]; } var xShapeBytes = new Uint8Array(new Int32Array(x.shape).buffer); var newShapeBytes = new Uint8Array(new Int32Array(newShape).buffer); var out = backend.makeOutput(newShape, x.dtype); var outId = backend.dataIdMap.get(out.dataId).id; wasmTile(xId, xShapeBytes, x.shape.length, newShapeBytes, newShape.length, CppDType[out.dtype], outId); return out; } var tileConfig = { kernelName: tfjsCore.Tile, backendName: 'wasm', setupFunc: setup$K, kernelFunc: tile }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmTopK; function setup$L(backend) { wasmTopK = backend.wasm.cwrap(tfjsCore.TopK, null /* void */, [ 'number', 'array', 'number', 'number', 'number', 'bool', 'number', 'number', ]); } var topk = function (_a) { var inputs = _a.inputs, backend = _a.backend, attrs = _a.attrs; var x = inputs.x; var k = attrs.k, sorted = attrs.sorted; var xId = backend.dataIdMap.get(x.dataId).id; var xShapeBytes = new Uint8Array(new Int32Array(x.shape).buffer); var outputShape = x.shape.slice(); outputShape[outputShape.length - 1] = k; var outValues = backend.makeOutput(outputShape, x.dtype); var outValuesId = backend.dataIdMap.get(outValues.dataId).id; var outIndices = backend.makeOutput(outputShape, 'int32'); var outIndicesId = backend.dataIdMap.get(outIndices.dataId).id; wasmTopK(xId, xShapeBytes, x.shape.length, CppDType[x.dtype], k, sorted, outValuesId, outIndicesId); return [outValues, outIndices]; }; var topKConfig = { kernelName: tfjsCore.TopK, backendName: 'wasm', setupFunc: setup$L, kernelFunc: topk, }; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var wasmTransform; function setup$M(backend) { wasmTransform = backend.wasm.cwrap(tfjsCore.Transform, null /*void*/, [ 'number', 'number', 'bool', 'number', 'number', 'number', 'number', 'number', 'number', 'array', 'number', 'number', 'number', 'number', 'number' // outId ]); } function transform(args) { var backend = args.backend, inputs = args.inputs, attrs = args.attrs; var image = inputs.image, transforms = inputs.transforms; var interpolation = attrs.interpolation, fillMode = attrs.fillMode, fillValue = attrs.fillValue, outputShape = attrs.outputShape; var _a = image.shape, batch = _a[0], imageHeight = _a[1], imageWidth = _a[2], numChannels = _a[3]; var _b = outputShape != null ? outputShape : [imageHeight, imageWidth], outHeight = _b[0], outWidth = _b[1]; var outShape = [batch, outHeight, outWidth, numChannels]; var strides = new Uint8Array(new Int32Array(tfjsCore.util.computeStrides(image.shape)).buffer); var out = backend.makeOutput(outShape, image.dtype); var outId = backend.dataIdMap.get(out.dataId).id; var imageData = backend.dataIdMap.get(image.dataId); var imageId = imageData.id; var transformsData = backend.dataIdMap.get(transforms.dataId); var transformsId = transformsData.id; var interpolationModeId = interpolation === 'nearest' ? 1 : 2; var fillModeId; switch (fillMode) { case 'constant': fillModeId = 1; break; case 'reflect': fillModeId = 2; break; case 'wrap': fillModeId = 3; break; case 'nearest': fillModeId = 4; break; default: fillModeId = 1; break; } wasmTransform(imageId, transformsId, (transforms.shape[0] > 1), batch, outHeight, outWidth, numChannels, imageWidth, imageHeight, strides, image.shape.length - 1, interpolationModeId, fillModeId, fillValue, outId); return out; } var transformConfig = { kernelName: tfjsCore.Transform, backendName: 'wasm', setupFunc: setup$M, kernelFunc: transform }; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function unpack(args) { var inputs = args.inputs, backend = args.backend, attrs = args.attrs; var value = inputs.value; var axis = attrs.axis; if (axis < 0) { axis += value.shape.length; } var numOutputs = value.shape[axis]; var rank = value.shape.length; var outShape = new Array(rank - 1); var outIndex = 0; for (var i = 0; i < rank; i++) { if (i !== axis) { outShape[outIndex++] = value.shape[i]; } } var outs = new Array(numOutputs); var begin = new Array(rank).fill(0); var size = value.shape.slice(); size[axis] = 1; for (var i = 0; i < outs.length; i++) { begin[axis] = i; outs[i] = slice({ inputs: { x: value }, attrs: { begin: begin, size: size }, backend: backend }); } return outs.map(function (_a) { var dataId = _a.dataId, dtype = _a.dtype; return ({ dataId: dataId, dtype: dtype, shape: outShape }); }); } var unpackConfig = { kernelName: tfjsCore.Unpack, backendName: 'wasm', kernelFunc: unpack, }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function zerosLike(args) { var x = args.inputs.x, backend = args.backend; var out = backend.makeOutput(x.shape, x.dtype); var outVals = backend.typedArrayFromHeap(out); outVals.fill(0); return out; } var zerosLikeConfig = { kernelName: tfjsCore.ZerosLike, backendName: 'wasm', kernelFunc: zerosLike, }; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ // List all kernel configs here var kernelConfigs = [ _fusedMatMulConfig, absConfig, addConfig, addNConfig, allConfig, anyConfig, argMaxConfig, avgPoolConfig, batchMatMulConfig, batchToSpaceNDConfig, castConfig, ceilConfig, clipByValueConfig, concatConfig, conv2DConfig, conv2DBackpropInputConfig, cosConfig, coshConfig, cropAndResizeConfig, cumprodConfig, cumsumConfig, depthToSpaceConfig, depthwiseConv2dNativeConfig, eluConfig, equalConfig, expConfig, expandDimsConfig, fillConfig, flipLeftRightConfig, floorConfig, floorDivConfig, fusedBatchNormConfig, fusedConv2DConfig, fusedDepthwiseConv2DConfig, gatherNdConfig, gatherV2Config, greaterConfig, greaterEqualConfig, identityConfig, leakyReluConfig, lessConfig, lessEqualConfig, logConfig, logicalAndConfig, maxConfig, maximumConfig, maxPoolConfig, meanConfig, minConfig, minimumConfig, mirrorPadConfig, multiplyConfig, negConfig, nonMaxSuppressionV3Config, nonMaxSuppressionV4Config, nonMaxSuppressionV5Config, notEqualConfig, oneHotConfig, onesLikeConfig, packConfig, padV2Config, powConfig, preluConfig, prodConfig, rangeConfig, realDivConfig, reluConfig, relu6Config, reshapeConfig, resizeBilinearConfig, reverseConfig, rotateWithOffsetConfig, roundConfig, rsqrtConfig, scatterNdConfig, selectConfig, sigmoidConfig, sinConfig, sliceConfig, softmaxConfig, spaceToBatchNDConfig, sparseFillEmptyRowsConfig, sparseReshapeConfig, sparseSegmentMeanConfig, sparseSegmentSumConfig, splitVConfig, sqrtConfig, squareConfig, squaredDifferenceConfig, stepConfig, stridedSliceConfig, subConfig, sumConfig, tanConfig, tanhConfig, tileConfig, topKConfig, transformConfig, transposeConfig, unpackConfig, zerosLikeConfig ]; for (var _i = 0, kernelConfigs_1 = kernelConfigs; _i < kernelConfigs_1.length; _i++) { var kernelConfig = kernelConfigs_1[_i]; tfjsCore.registerKernel(kernelConfig); } /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise */ var extendStatics = function(d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; function __extends(d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var _this = undefined; var ENV = tfjsCore.env(); /** * True if SIMD is supported. */ // From: https://github.com/GoogleChromeLabs/wasm-feature-detect ENV.registerFlag( // This typed array passed in to WebAssembly.validate is WebAssembly binary // code. In this case it is a small program that contains SIMD // instructions. 'WASM_HAS_SIMD_SUPPORT', function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, WebAssembly.validate(new Uint8Array([ 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 9, 1, 7, 0, 65, 0, 253, 15, 26, 11 ]))]; }); }); }); /** * True if threads are supported. */ // From: https://github.com/GoogleChromeLabs/wasm-feature-detect ENV.registerFlag('WASM_HAS_MULTITHREAD_SUPPORT', function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { // TODO(annxingyuan): Enable node support once this is resolved: // https://github.com/tensorflow/tfjs/issues/3830 if (ENV.get('IS_NODE')) { return [2 /*return*/, false]; } try { // Test for transferability of SABs (needed for Firefox) // https://groups.google.com/forum/#!msg/mozilla.dev.platform/IHkBZlHETpA/dwsMNchWEQAJ new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)); // This typed array is a WebAssembly program containing threaded // instructions. return [2 /*return*/, WebAssembly.validate(new Uint8Array([ 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 5, 4, 1, 3, 1, 1, 10, 11, 1, 9, 0, 65, 0, 254, 16, 2, 0, 26, 11 ]))]; } catch (e) { return [2 /*return*/, false]; } return [2 /*return*/]; }); }); }); var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var tfjsBackendWasmThreadedSimd = createCommonjsModule(function (module, exports) { var WasmBackendModuleThreadedSimd = (() => { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; return ( function(WasmBackendModuleThreadedSimd) { WasmBackendModuleThreadedSimd = WasmBackendModuleThreadedSimd || {}; function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer);}return HEAP8}function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer);}return HEAPU8}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer);}return HEAP32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=buffer){updateGlobalBufferAndViews(wasmMemory.buffer);}return HEAPF64}var Module=typeof WasmBackendModuleThreadedSimd!=="undefined"?WasmBackendModuleThreadedSimd:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject;});var beforeListeners;if(typeof process!=="undefined"&&process.listeners){beforeListeners={uncaughtException:process.listeners("uncaughtException"),unhandledRejection:process.listeners("unhandledRejection")};}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog);}var fs$1;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=path.dirname(scriptDirectory)+"/";}else {scriptDirectory=__dirname+"/";}requireNodeFS=(()=>{if(!nodePath){fs$1=fs;nodePath=path;}});read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs$1.readFileSync(filename,binary?undefined:"utf8")};readBinary=(filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret);}return ret});readAsync=((filename,onload,onerror)=>{requireNodeFS();filename=nodePath["normalize"](filename);fs$1.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer);});});if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/");}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status);});Module["inspect"]=function(){return "[Emscripten Module object]"};let nodeWorkerThreads;try{nodeWorkerThreads=worker_threads;}catch(e){console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?');throw e}commonjsGlobal.Worker=nodeWorkerThreads.Worker;}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href;}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src;}if(typeof _scriptDir !== "undefined" && _scriptDir){scriptDirectory=_scriptDir;}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1);}else {scriptDirectory="";}if(!ENVIRONMENT_IS_NODE){read_=(url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText});if(ENVIRONMENT_IS_WORKER){readBinary=(url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)});}readAsync=((url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=(()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror();});xhr.onerror=onerror;xhr.send(null);});}}if(ENVIRONMENT_IS_NODE){if(typeof performance==="undefined"){commonjsGlobal.performance=perf_hooks.performance;}}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.warn.bind(console);if(ENVIRONMENT_IS_NODE){requireNodeFS();defaultPrint=(str=>fs$1.writeSync(1,str+"\n"));defaultPrintErr=(str=>fs$1.writeSync(2,str+"\n"));}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text);}}var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected");}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function getCFunc(ident){var func=Module["_"+ident];return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len);}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{if(data.buffer instanceof SharedArrayBuffer){data=new Uint8Array(data);}return textDecoder.decode.call(textDecoder,data)});}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else {var str="";while(idx>10,56320|ch&1023);}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023;}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u;}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63;}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;}else {if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4;}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoderWrapper("utf-16le"):undefined;function writeArrayToMemory(array,buffer){GROWABLE_HEAP_I8().set(array,buffer);}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple;}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"];}function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf);}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"];}else {if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"];}else {wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":2147483648/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)");}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer;}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift());}}callRuntimeCallbacks(__ATPRERUN__);}function initRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATINIT__);}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;PThread.terminateAllThreads();}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift());}}callRuntimeCallbacks(__ATPOSTRUN__);}function addOnPreRun(cb){__ATPRERUN__.unshift(cb);}function addOnInit(cb){__ATINIT__.unshift(cb);}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb);}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies);}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies);}if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback();}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"onAbort","arg":what});}else {if(Module["onAbort"]){Module["onAbort"](what);}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="tfjs-backend-wasm-threaded-simd.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile);}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else {throw "both async and sync fetching of the wasm failed"}}catch(err){abort(err);}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw "failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else {if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response));},reject);})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;registerTlsInit(Module["asm"]["emscripten_tls_init"]);wasmTable=Module["asm"]["__indirect_function_table"];addOnInit(Module["asm"]["__wasm_call_ctors"]);wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){if(!--numWorkersToLoad)removeRunDependency();});});}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency();}function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"]);}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason);})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else {return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return {}}var ASM_CONSTS={};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getWasmTableEntry(func)();}else {getWasmTableEntry(func)(callback.arg);}}else {func(callback.arg===undefined?null:callback.arg);}}}function withStackSave(f){var stack=stackSave();var ret=f();stackRestore(stack);return ret}function killThread(pthread_ptr){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var pthread=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];pthread.worker.terminate();__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined;}function cancelThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"});}function cleanupThread(pthread_ptr){var pthread=PThread.pthreads[pthread_ptr];if(pthread){GROWABLE_HEAP_I32()[pthread_ptr>>2]=0;var worker=pthread.worker;PThread.returnWorkerToPool(worker);}}function _exit(status){exit(status);}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e);}var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],init:function(){if(ENVIRONMENT_IS_PTHREAD){PThread.initWorker();}else {PThread.initMainThread();}},initMainThread:function(){var pthreadPoolSize=8;for(var i=0;i>2]=0;try{func();}finally{GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls>>2]=1;}},receiveObjectTransfer:function(data){},threadInit:function(){for(var i in PThread.tlsInitFunctions){PThread.tlsInitFunctions[i]();}},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=(e=>{var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(d,d["transferList"]);}else {err('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!");}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processQueuedMainThreadWork"){_emscripten_main_thread_process_queued_calls();}else if(cmd==="spawnThread"){spawnThread(d);}else if(cmd==="cleanupThread"){cleanupThread(d["thread"]);}else if(cmd==="killThread"){killThread(d["thread"]);}else if(cmd==="cancelThread"){cancelThread(d["thread"]);}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread;}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"]);}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"]);}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"]);}else if(d.target==="setimmediate"){worker.postMessage(d);}else if(cmd==="onAbort"){if(Module["onAbort"]){Module["onAbort"](d["arg"]);}}else {err("worker sent an unknown command "+cmd);}PThread.currentProxiedOperationCallerThread=undefined;});worker.onerror=(e=>{var message="worker sent an error!";err(message+" "+e.filename+":"+e.lineno+": "+e.message);throw e});if(ENVIRONMENT_IS_NODE){worker.on("message",function(data){worker.onmessage({data:data});});worker.on("error",function(e){worker.onerror(e);});worker.on("detachedExit",function(){});}worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule});},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("tfjs-backend-wasm-threaded-simd.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs));},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]);}return PThread.unusedWorkers.pop()}};function establishStackSpace(){var pthread_ptr=_pthread_self();var stackTop=GROWABLE_HEAP_I32()[pthread_ptr+44>>2];var stackSize=GROWABLE_HEAP_I32()[pthread_ptr+48>>2];var stackMax=stackTop-stackSize;_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop);}Module["establishStackSpace"]=establishStackSpace;function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,0,returnCode);try{_exit(returnCode);}catch(e){handleException(e);}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr);}return func}function invokeEntryPoint(ptr,arg){return getWasmTableEntry(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function registerTlsInit(tlsInitFunc,moduleExports,metadata){PThread.tlsInitFunctions.push(tlsInitFunc);}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=(()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6});}else if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=(()=>performance.now()-Module["__performance_now_clock_drift"]);}else _emscripten_get_now=(()=>performance.now());var _emscripten_get_now_is_monotonic=true;function setErrNo(value){GROWABLE_HEAP_I32()[___errno_location()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now();}else if((clk_id===1||clk_id===4)&&_emscripten_get_now_is_monotonic){now=_emscripten_get_now();}else {setErrNo(28);return -1}GROWABLE_HEAP_I32()[tp>>2]=now/1e3|0;GROWABLE_HEAP_I32()[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(a0,a1){return _clock_gettime(a0,a1)}function ___emscripten_init_main_thread_js(tb){__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB);PThread.threadInit();}function ___emscripten_thread_cleanup(thread){if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread});}function spawnThread(threadParams){var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,threadInfoStruct:threadParams.pthread_ptr};worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr};worker.runPthread=(()=>{msg.time=performance.now();worker.postMessage(msg,threadParams.transferList);});if(worker.loaded){worker.runPthread();delete worker.runPthread;}return 0}function ___pthread_create_js(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer==="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return _emscripten_sync_run_in_main_thread_4(687865856,pthread_ptr,attr,start_routine,arg)}var threadParams={startRoutine:start_routine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function __emscripten_default_pthread_stack_size(){return 2097152}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId){postMessage({"cmd":"processQueuedMainThreadWork"});}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processThreadQueue"});}else {var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processThreadQueue"});}return 1}function _abort(){abort("");}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_NODE)return;if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread");}function _emscripten_get_heap_max(){return 2147483648}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num);}function _emscripten_num_logical_cores(){if(ENVIRONMENT_IS_NODE)return os.cpus().length;return navigator["hardwareConcurrency"]}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var outerArgs=arguments;return withStackSave(function(){var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i>3;for(var i=0;i>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=GROWABLE_HEAP_U8().length;requestedSize=requestedSize>>>0;if(requestedSize<=oldSize){return false}var maxHeapSize=_emscripten_get_heap_max();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i);}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[];},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){JSEvents.removeEventListenersRegistered=true;}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence>2]=eventTypeId;GROWABLE_HEAP_I32()[varargs+4>>2]=eventData;GROWABLE_HEAP_I32()[varargs+8>>2]=userData;_emscripten_dispatch_to_thread_(targetThread,637534208,eventHandlerFunc,eventData,varargs);});},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return "";if(target==window)return "#window";if(target==screen)return "#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height){withStackSave(function(){var varargs=stackAlloc(12);var targetCanvasPtr=0;if(targetCanvas){targetCanvasPtr=stringToNewUTF8(targetCanvas);}GROWABLE_HEAP_I32()[varargs>>2]=targetCanvasPtr;GROWABLE_HEAP_I32()[varargs+4>>2]=width;GROWABLE_HEAP_I32()[varargs+8>>2]=height;_emscripten_dispatch_to_thread_(targetThread,657457152,0,targetCanvasPtr,varargs);});}function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread,targetCanvas,width,height){targetCanvas=targetCanvas?UTF8ToString(targetCanvas):"";_emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height);}function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size_calling_thread(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return -4;if(canvas.canvasSharedPtr){GROWABLE_HEAP_I32()[canvas.canvasSharedPtr>>2]=width;GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+4>>2]=height;}if(canvas.offscreenCanvas||!canvas.controlTransferredOffscreen){if(canvas.offscreenCanvas)canvas=canvas.offscreenCanvas;var autoResizeViewport=false;if(canvas.GLctxObject&&canvas.GLctxObject.GLctx){var prevViewport=canvas.GLctxObject.GLctx.getParameter(2978);autoResizeViewport=prevViewport[0]===0&&prevViewport[1]===0&&prevViewport[2]===canvas.width&&prevViewport[3]===canvas.height;}canvas.width=width;canvas.height=height;if(autoResizeViewport){canvas.GLctxObject.GLctx.viewport(0,0,width,height);}}else if(canvas.canvasSharedPtr){var targetThread=GROWABLE_HEAP_I32()[canvas.canvasSharedPtr+8>>2];_emscripten_set_offscreencanvas_size_on_target_thread(targetThread,target,width,height);return 1}else {return -4}return 0}function _emscripten_set_canvas_element_size_main_thread(target,width,height){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,target,width,height);return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(canvas){return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}else {return _emscripten_set_canvas_element_size_main_thread(target,width,height)}}function _emscripten_unwind_to_js_event_loop(){throw "unwind"}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor);};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount);};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount);};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao);};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao);};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs);};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return !!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode;}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(GROWABLE_HEAP_I32()[string+i*4>>2],len<0?undefined:len);}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;canvas.getContext=function(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null};}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);GROWABLE_HEAP_I32()[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context);}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return !(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null;},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query");}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext);}});}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=GROWABLE_HEAP_I32()[a+(24>>2)];var contextAttributes={"alpha":!!GROWABLE_HEAP_I32()[a+(0>>2)],"depth":!!GROWABLE_HEAP_I32()[a+(4>>2)],"stencil":!!GROWABLE_HEAP_I32()[a+(8>>2)],"antialias":!!GROWABLE_HEAP_I32()[a+(12>>2)],"premultipliedAlpha":!!GROWABLE_HEAP_I32()[a+(16>>2)],"preserveDrawingBuffer":!!GROWABLE_HEAP_I32()[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!GROWABLE_HEAP_I32()[a+(28>>2)],majorVersion:GROWABLE_HEAP_I32()[a+(32>>2)],minorVersion:GROWABLE_HEAP_I32()[a+(36>>2)],enableExtensionsByDefault:GROWABLE_HEAP_I32()[a+(40>>2)],explicitSwapControl:GROWABLE_HEAP_I32()[a+(44>>2)],proxyContextToMainThread:GROWABLE_HEAP_I32()[a+(48>>2)],renderViaOffscreenBackBuffer:GROWABLE_HEAP_I32()[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0;}else {buffer.push(curr);}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=GROWABLE_HEAP_I32()[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,fd);return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,fd,offset_low,offset_high,whence,newOffset)}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,fd,iov,iovcnt,pnum);var num=0;for(var i=0;i>2];var len=GROWABLE_HEAP_I32()[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _setTempRet0(val){}PThread.init();var GLctx;var proxiedFunctionTable=[null,exitOnMainThread,_emscripten_set_canvas_element_size_main_thread,_fd_close,_fd_seek,_fd_write];var asmLibraryArg={"__clock_gettime":___clock_gettime,"__emscripten_init_main_thread_js":___emscripten_init_main_thread_js,"__emscripten_thread_cleanup":___emscripten_thread_cleanup,"__pthread_create_js":___pthread_create_js,"_emscripten_default_pthread_stack_size":__emscripten_default_pthread_stack_size,"_emscripten_notify_thread_queue":__emscripten_notify_thread_queue,"abort":_abort,"emscripten_check_blocking_allowed":_emscripten_check_blocking_allowed,"emscripten_get_heap_max":_emscripten_get_heap_max,"emscripten_get_now":_emscripten_get_now,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_num_logical_cores":_emscripten_num_logical_cores,"emscripten_receive_on_main_thread_js":_emscripten_receive_on_main_thread_js,"emscripten_resize_heap":_emscripten_resize_heap,"emscripten_set_canvas_element_size":_emscripten_set_canvas_element_size,"emscripten_unwind_to_js_event_loop":_emscripten_unwind_to_js_event_loop,"emscripten_webgl_create_context":_emscripten_webgl_create_context,"exit":_exit,"fd_close":_fd_close,"fd_seek":_fd_seek,"fd_write":_fd_write,"memory":wasmMemory||Module["wasmMemory"],"setTempRet0":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return (___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var _init=Module["_init"]=function(){return (_init=Module["_init"]=Module["asm"]["init"]).apply(null,arguments)};var _init_with_threads_count=Module["_init_with_threads_count"]=function(){return (_init_with_threads_count=Module["_init_with_threads_count"]=Module["asm"]["init_with_threads_count"]).apply(null,arguments)};var _get_threads_count=Module["_get_threads_count"]=function(){return (_get_threads_count=Module["_get_threads_count"]=Module["asm"]["get_threads_count"]).apply(null,arguments)};var _register_tensor=Module["_register_tensor"]=function(){return (_register_tensor=Module["_register_tensor"]=Module["asm"]["register_tensor"]).apply(null,arguments)};var _dispose_data=Module["_dispose_data"]=function(){return (_dispose_data=Module["_dispose_data"]=Module["asm"]["dispose_data"]).apply(null,arguments)};var _dispose=Module["_dispose"]=function(){return (_dispose=Module["_dispose"]=Module["asm"]["dispose"]).apply(null,arguments)};var _Abs=Module["_Abs"]=function(){return (_Abs=Module["_Abs"]=Module["asm"]["Abs"]).apply(null,arguments)};var _Add=Module["_Add"]=function(){return (_Add=Module["_Add"]=Module["asm"]["Add"]).apply(null,arguments)};var _AddN=Module["_AddN"]=function(){return (_AddN=Module["_AddN"]=Module["asm"]["AddN"]).apply(null,arguments)};var _All=Module["_All"]=function(){return (_All=Module["_All"]=Module["asm"]["All"]).apply(null,arguments)};var _Any=Module["_Any"]=function(){return (_Any=Module["_Any"]=Module["asm"]["Any"]).apply(null,arguments)};var _ArgMax=Module["_ArgMax"]=function(){return (_ArgMax=Module["_ArgMax"]=Module["asm"]["ArgMax"]).apply(null,arguments)};var _AvgPool=Module["_AvgPool"]=function(){return (_AvgPool=Module["_AvgPool"]=Module["asm"]["AvgPool"]).apply(null,arguments)};var _BatchMatMul=Module["_BatchMatMul"]=function(){return (_BatchMatMul=Module["_BatchMatMul"]=Module["asm"]["BatchMatMul"]).apply(null,arguments)};var _Ceil=Module["_Ceil"]=function(){return (_Ceil=Module["_Ceil"]=Module["asm"]["Ceil"]).apply(null,arguments)};var _ClipByValue=Module["_ClipByValue"]=function(){return (_ClipByValue=Module["_ClipByValue"]=Module["asm"]["ClipByValue"]).apply(null,arguments)};var _Conv2D=Module["_Conv2D"]=function(){return (_Conv2D=Module["_Conv2D"]=Module["asm"]["Conv2D"]).apply(null,arguments)};var _Conv2DBackpropInput=Module["_Conv2DBackpropInput"]=function(){return (_Conv2DBackpropInput=Module["_Conv2DBackpropInput"]=Module["asm"]["Conv2DBackpropInput"]).apply(null,arguments)};var _Cos=Module["_Cos"]=function(){return (_Cos=Module["_Cos"]=Module["asm"]["Cos"]).apply(null,arguments)};var _Cosh=Module["_Cosh"]=function(){return (_Cosh=Module["_Cosh"]=Module["asm"]["Cosh"]).apply(null,arguments)};var _CropAndResize=Module["_CropAndResize"]=function(){return (_CropAndResize=Module["_CropAndResize"]=Module["asm"]["CropAndResize"]).apply(null,arguments)};var _Cumprod=Module["_Cumprod"]=function(){return (_Cumprod=Module["_Cumprod"]=Module["asm"]["Cumprod"]).apply(null,arguments)};var _Cumsum=Module["_Cumsum"]=function(){return (_Cumsum=Module["_Cumsum"]=Module["asm"]["Cumsum"]).apply(null,arguments)};var _DepthToSpace=Module["_DepthToSpace"]=function(){return (_DepthToSpace=Module["_DepthToSpace"]=Module["asm"]["DepthToSpace"]).apply(null,arguments)};var _DepthwiseConv2dNative=Module["_DepthwiseConv2dNative"]=function(){return (_DepthwiseConv2dNative=Module["_DepthwiseConv2dNative"]=Module["asm"]["DepthwiseConv2dNative"]).apply(null,arguments)};var _Elu=Module["_Elu"]=function(){return (_Elu=Module["_Elu"]=Module["asm"]["Elu"]).apply(null,arguments)};var _Equal=Module["_Equal"]=function(){return (_Equal=Module["_Equal"]=Module["asm"]["Equal"]).apply(null,arguments)};var _Exp=Module["_Exp"]=function(){return (_Exp=Module["_Exp"]=Module["asm"]["Exp"]).apply(null,arguments)};var _FlipLeftRight=Module["_FlipLeftRight"]=function(){return (_FlipLeftRight=Module["_FlipLeftRight"]=Module["asm"]["FlipLeftRight"]).apply(null,arguments)};var _Floor=Module["_Floor"]=function(){return (_Floor=Module["_Floor"]=Module["asm"]["Floor"]).apply(null,arguments)};var _FloorDiv=Module["_FloorDiv"]=function(){return (_FloorDiv=Module["_FloorDiv"]=Module["asm"]["FloorDiv"]).apply(null,arguments)};var _FusedBatchNorm=Module["_FusedBatchNorm"]=function(){return (_FusedBatchNorm=Module["_FusedBatchNorm"]=Module["asm"]["FusedBatchNorm"]).apply(null,arguments)};var _FusedConv2D=Module["_FusedConv2D"]=function(){return (_FusedConv2D=Module["_FusedConv2D"]=Module["asm"]["FusedConv2D"]).apply(null,arguments)};var _FusedDepthwiseConv2D=Module["_FusedDepthwiseConv2D"]=function(){return (_FusedDepthwiseConv2D=Module["_FusedDepthwiseConv2D"]=Module["asm"]["FusedDepthwiseConv2D"]).apply(null,arguments)};var _Gather=Module["_Gather"]=function(){return (_Gather=Module["_Gather"]=Module["asm"]["Gather"]).apply(null,arguments)};var _GatherNd=Module["_GatherNd"]=function(){return (_GatherNd=Module["_GatherNd"]=Module["asm"]["GatherNd"]).apply(null,arguments)};var _Greater=Module["_Greater"]=function(){return (_Greater=Module["_Greater"]=Module["asm"]["Greater"]).apply(null,arguments)};var _GreaterEqual=Module["_GreaterEqual"]=function(){return (_GreaterEqual=Module["_GreaterEqual"]=Module["asm"]["GreaterEqual"]).apply(null,arguments)};var _LeakyRelu=Module["_LeakyRelu"]=function(){return (_LeakyRelu=Module["_LeakyRelu"]=Module["asm"]["LeakyRelu"]).apply(null,arguments)};var _Less=Module["_Less"]=function(){return (_Less=Module["_Less"]=Module["asm"]["Less"]).apply(null,arguments)};var _LessEqual=Module["_LessEqual"]=function(){return (_LessEqual=Module["_LessEqual"]=Module["asm"]["LessEqual"]).apply(null,arguments)};var _Log=Module["_Log"]=function(){return (_Log=Module["_Log"]=Module["asm"]["Log"]).apply(null,arguments)};var _LogicalAnd=Module["_LogicalAnd"]=function(){return (_LogicalAnd=Module["_LogicalAnd"]=Module["asm"]["LogicalAnd"]).apply(null,arguments)};var _Max=Module["_Max"]=function(){return (_Max=Module["_Max"]=Module["asm"]["Max"]).apply(null,arguments)};var _MaxPool=Module["_MaxPool"]=function(){return (_MaxPool=Module["_MaxPool"]=Module["asm"]["MaxPool"]).apply(null,arguments)};var _Maximum=Module["_Maximum"]=function(){return (_Maximum=Module["_Maximum"]=Module["asm"]["Maximum"]).apply(null,arguments)};var _Mean=Module["_Mean"]=function(){return (_Mean=Module["_Mean"]=Module["asm"]["Mean"]).apply(null,arguments)};var _Min=Module["_Min"]=function(){return (_Min=Module["_Min"]=Module["asm"]["Min"]).apply(null,arguments)};var _Minimum=Module["_Minimum"]=function(){return (_Minimum=Module["_Minimum"]=Module["asm"]["Minimum"]).apply(null,arguments)};var _MirrorPad=Module["_MirrorPad"]=function(){return (_MirrorPad=Module["_MirrorPad"]=Module["asm"]["MirrorPad"]).apply(null,arguments)};var _Multiply=Module["_Multiply"]=function(){return (_Multiply=Module["_Multiply"]=Module["asm"]["Multiply"]).apply(null,arguments)};var _Neg=Module["_Neg"]=function(){return (_Neg=Module["_Neg"]=Module["asm"]["Neg"]).apply(null,arguments)};var _NonMaxSuppressionV3=Module["_NonMaxSuppressionV3"]=function(){return (_NonMaxSuppressionV3=Module["_NonMaxSuppressionV3"]=Module["asm"]["NonMaxSuppressionV3"]).apply(null,arguments)};var _NonMaxSuppressionV4=Module["_NonMaxSuppressionV4"]=function(){return (_NonMaxSuppressionV4=Module["_NonMaxSuppressionV4"]=Module["asm"]["NonMaxSuppressionV4"]).apply(null,arguments)};var _NonMaxSuppressionV5=Module["_NonMaxSuppressionV5"]=function(){return (_NonMaxSuppressionV5=Module["_NonMaxSuppressionV5"]=Module["asm"]["NonMaxSuppressionV5"]).apply(null,arguments)};var _NotEqual=Module["_NotEqual"]=function(){return (_NotEqual=Module["_NotEqual"]=Module["asm"]["NotEqual"]).apply(null,arguments)};var _OneHot=Module["_OneHot"]=function(){return (_OneHot=Module["_OneHot"]=Module["asm"]["OneHot"]).apply(null,arguments)};var _PadV2=Module["_PadV2"]=function(){return (_PadV2=Module["_PadV2"]=Module["asm"]["PadV2"]).apply(null,arguments)};var _Pow=Module["_Pow"]=function(){return (_Pow=Module["_Pow"]=Module["asm"]["Pow"]).apply(null,arguments)};var _Prelu=Module["_Prelu"]=function(){return (_Prelu=Module["_Prelu"]=Module["asm"]["Prelu"]).apply(null,arguments)};var _Prod=Module["_Prod"]=function(){return (_Prod=Module["_Prod"]=Module["asm"]["Prod"]).apply(null,arguments)};var _RealDiv=Module["_RealDiv"]=function(){return (_RealDiv=Module["_RealDiv"]=Module["asm"]["RealDiv"]).apply(null,arguments)};var _Relu=Module["_Relu"]=function(){return (_Relu=Module["_Relu"]=Module["asm"]["Relu"]).apply(null,arguments)};var _Relu6=Module["_Relu6"]=function(){return (_Relu6=Module["_Relu6"]=Module["asm"]["Relu6"]).apply(null,arguments)};var _ResizeBilinear=Module["_ResizeBilinear"]=function(){return (_ResizeBilinear=Module["_ResizeBilinear"]=Module["asm"]["ResizeBilinear"]).apply(null,arguments)};var _Reverse=Module["_Reverse"]=function(){return (_Reverse=Module["_Reverse"]=Module["asm"]["Reverse"]).apply(null,arguments)};var _RotateWithOffset=Module["_RotateWithOffset"]=function(){return (_RotateWithOffset=Module["_RotateWithOffset"]=Module["asm"]["RotateWithOffset"]).apply(null,arguments)};var _Round=Module["_Round"]=function(){return (_Round=Module["_Round"]=Module["asm"]["Round"]).apply(null,arguments)};var _Rsqrt=Module["_Rsqrt"]=function(){return (_Rsqrt=Module["_Rsqrt"]=Module["asm"]["Rsqrt"]).apply(null,arguments)};var _ScatterNd=Module["_ScatterNd"]=function(){return (_ScatterNd=Module["_ScatterNd"]=Module["asm"]["ScatterNd"]).apply(null,arguments)};var _SelectV2=Module["_SelectV2"]=function(){return (_SelectV2=Module["_SelectV2"]=Module["asm"]["SelectV2"]).apply(null,arguments)};var _Sigmoid=Module["_Sigmoid"]=function(){return (_Sigmoid=Module["_Sigmoid"]=Module["asm"]["Sigmoid"]).apply(null,arguments)};var _Sin=Module["_Sin"]=function(){return (_Sin=Module["_Sin"]=Module["asm"]["Sin"]).apply(null,arguments)};var _Softmax=Module["_Softmax"]=function(){return (_Softmax=Module["_Softmax"]=Module["asm"]["Softmax"]).apply(null,arguments)};var _SparseFillEmptyRows=Module["_SparseFillEmptyRows"]=function(){return (_SparseFillEmptyRows=Module["_SparseFillEmptyRows"]=Module["asm"]["SparseFillEmptyRows"]).apply(null,arguments)};var _SparseReshape=Module["_SparseReshape"]=function(){return (_SparseReshape=Module["_SparseReshape"]=Module["asm"]["SparseReshape"]).apply(null,arguments)};var _SparseSegmentReduction=Module["_SparseSegmentReduction"]=function(){return (_SparseSegmentReduction=Module["_SparseSegmentReduction"]=Module["asm"]["SparseSegmentReduction"]).apply(null,arguments)};var _Sqrt=Module["_Sqrt"]=function(){return (_Sqrt=Module["_Sqrt"]=Module["asm"]["Sqrt"]).apply(null,arguments)};var _Square=Module["_Square"]=function(){return (_Square=Module["_Square"]=Module["asm"]["Square"]).apply(null,arguments)};var _SquaredDifference=Module["_SquaredDifference"]=function(){return (_SquaredDifference=Module["_SquaredDifference"]=Module["asm"]["SquaredDifference"]).apply(null,arguments)};var _Step=Module["_Step"]=function(){return (_Step=Module["_Step"]=Module["asm"]["Step"]).apply(null,arguments)};var _StridedSlice=Module["_StridedSlice"]=function(){return (_StridedSlice=Module["_StridedSlice"]=Module["asm"]["StridedSlice"]).apply(null,arguments)};var _Sub=Module["_Sub"]=function(){return (_Sub=Module["_Sub"]=Module["asm"]["Sub"]).apply(null,arguments)};var _Sum=Module["_Sum"]=function(){return (_Sum=Module["_Sum"]=Module["asm"]["Sum"]).apply(null,arguments)};var _Tan=Module["_Tan"]=function(){return (_Tan=Module["_Tan"]=Module["asm"]["Tan"]).apply(null,arguments)};var _Tanh=Module["_Tanh"]=function(){return (_Tanh=Module["_Tanh"]=Module["asm"]["Tanh"]).apply(null,arguments)};var _Tile=Module["_Tile"]=function(){return (_Tile=Module["_Tile"]=Module["asm"]["Tile"]).apply(null,arguments)};var _TopK=Module["_TopK"]=function(){return (_TopK=Module["_TopK"]=Module["asm"]["TopK"]).apply(null,arguments)};var _Transform=Module["_Transform"]=function(){return (_Transform=Module["_Transform"]=Module["asm"]["Transform"]).apply(null,arguments)};var _Transpose=Module["_Transpose"]=function(){return (_Transpose=Module["_Transpose"]=Module["asm"]["Transpose"]).apply(null,arguments)};var __FusedMatMul=Module["__FusedMatMul"]=function(){return (__FusedMatMul=Module["__FusedMatMul"]=Module["asm"]["_FusedMatMul"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return (_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var _free=Module["_free"]=function(){return (_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return (_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["emscripten_tls_init"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return (___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return (_pthread_self=Module["_pthread_self"]=Module["asm"]["pthread_self"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return (_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["emscripten_main_thread_process_queued_calls"]).apply(null,arguments)};var __emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=function(){return (__emscripten_thread_crashed=Module["__emscripten_thread_crashed"]=Module["asm"]["_emscripten_thread_crashed"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return (__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["_emscripten_thread_init"]).apply(null,arguments)};var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=function(){return (_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=Module["asm"]["emscripten_current_thread_process_queued_calls"]).apply(null,arguments)};var _emscripten_main_browser_thread_id=Module["_emscripten_main_browser_thread_id"]=function(){return (_emscripten_main_browser_thread_id=Module["_emscripten_main_browser_thread_id"]=Module["asm"]["emscripten_main_browser_thread_id"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_2=Module["_emscripten_sync_run_in_main_thread_2"]=function(){return (_emscripten_sync_run_in_main_thread_2=Module["_emscripten_sync_run_in_main_thread_2"]=Module["asm"]["emscripten_sync_run_in_main_thread_2"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=function(){return (_emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=Module["asm"]["emscripten_sync_run_in_main_thread_4"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return (_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["emscripten_run_in_main_runtime_thread_js"]).apply(null,arguments)};var _emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=function(){return (_emscripten_dispatch_to_thread_=Module["_emscripten_dispatch_to_thread_"]=Module["asm"]["emscripten_dispatch_to_thread_"]).apply(null,arguments)};var __emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=function(){return (__emscripten_thread_free_data=Module["__emscripten_thread_free_data"]=Module["asm"]["_emscripten_thread_free_data"]).apply(null,arguments)};var __emscripten_thread_exit=Module["__emscripten_thread_exit"]=function(){return (__emscripten_thread_exit=Module["__emscripten_thread_exit"]=Module["asm"]["_emscripten_thread_exit"]).apply(null,arguments)};var _memalign=Module["_memalign"]=function(){return (_memalign=Module["_memalign"]=Module["asm"]["memalign"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return (_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["emscripten_stack_set_limits"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return (stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return (stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return (stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var dynCall_iijjiiii=Module["dynCall_iijjiiii"]=function(){return (dynCall_iijjiiii=Module["dynCall_iijjiiii"]=Module["asm"]["dynCall_iijjiiii"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return (dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=21464;Module["cwrap"]=cwrap;Module["keepRuntimeAlive"]=keepRuntimeAlive;Module["PThread"]=PThread;Module["PThread"]=PThread;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status;}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller;};function run(args){if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun();}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("");},1);doRun();},1);}else {doRun();}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!implicit){if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw "unwind"}}if(keepRuntimeAlive());else {exitRuntime();}procExit(status);}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();if(Module["onExit"])Module["onExit"](code);ABORT=true;}quit_(code,new ExitStatus(code));}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()();}}run();var listenersAdded;if(beforeListeners){listenersAdded={uncaughtException:process.listeners("uncaughtException").filter(function(listener){return !beforeListeners.uncaughtException.indexOf(listener)>-1}),unhandledRejection:process.listeners("unhandledRejection").filter(function(listener){return !beforeListeners.unhandledRejection.indexOf(listener)>-1})};}var actualModule;if(typeof WasmBackendModule!=="undefined"){actualModule=WasmBackendModule;}else if(typeof WasmBackendModuleThreadedSimd!=="undefined"){actualModule=WasmBackendModuleThreadedSimd;}else {throw new Error("Could not find wasm module in post.js")}if(listenersAdded){var tmpDispose=actualModule["_dispose"];actualModule["_dispose"]=function(){tmpDispose();listenersAdded.uncaughtException.forEach(function(listener){process.removeListener("uncaughtException",listener);});listenersAdded.unhandledRejection.forEach(function(listener){process.removeListener("unhandledRejection",listener);});};} return WasmBackendModuleThreadedSimd.ready } ); })(); module.exports = WasmBackendModuleThreadedSimd; }); const wasmWorkerContents = '"use strict";var Module={};var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var fs=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(fs.readFileSync(f,"utf8"))},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+"\n");return}console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=((info,receiveInstance)=>{var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports});self.onmessage=(e=>{try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance})}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInit();try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(Module["keepRuntimeAlive"]()){Module["PThread"].setExitStatus(result)}else{Module["__emscripten_thread_exit"](result)}}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else if(e.data.cmd==="processProxyingQueue"){if(Module["_pthread_self"]()){Module["_emscripten_proxy_execute_queue"](e.data.queue)}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}});'; var tfjsBackendWasm = createCommonjsModule(function (module, exports) { var WasmBackendModule = (() => { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; return ( function(WasmBackendModule) { WasmBackendModule = WasmBackendModule || {}; var Module=typeof WasmBackendModule!=="undefined"?WasmBackendModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject;});var beforeListeners;if(typeof process!=="undefined"&&process.listeners){beforeListeners={uncaughtException:process.listeners("uncaughtException"),unhandledRejection:process.listeners("unhandledRejection")};}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog);}var fs$1;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=path.dirname(scriptDirectory)+"/";}else {scriptDirectory=__dirname+"/";}requireNodeFS=(()=>{if(!nodePath){fs$1=fs;nodePath=path;}});read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs$1.readFileSync(filename,binary?undefined:"utf8")};readBinary=(filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret);}return ret});readAsync=((filename,onload,onerror)=>{requireNodeFS();filename=nodePath["normalize"](filename);fs$1.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer);});});if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/");}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=((status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status);});Module["inspect"]=function(){return "[Emscripten Module object]"};}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href;}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src;}if(_scriptDir){scriptDirectory=_scriptDir;}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1);}else {scriptDirectory="";}{read_=(url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText});if(ENVIRONMENT_IS_WORKER){readBinary=(url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)});}readAsync=((url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=(()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror();});xhr.onerror=onerror;xhr.send(null);});}}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected");}var wasmMemory;var ABORT=false;function getCFunc(ident){var func=Module["_"+ident];return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len);}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else {var str="";while(idx>10,56320|ch&1023);}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023;}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u;}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63;}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;}else {if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer);}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple;}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf);}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift());}}callRuntimeCallbacks(__ATPRERUN__);}function initRuntime(){callRuntimeCallbacks(__ATINIT__);}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift());}}callRuntimeCallbacks(__ATPOSTRUN__);}function addOnPreRun(cb){__ATPRERUN__.unshift(cb);}function addOnInit(cb){__ATINIT__.unshift(cb);}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb);}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies);}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies);}if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback();}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){{if(Module["onAbort"]){Module["onAbort"](what);}}what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="tfjs-backend-wasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile);}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else {throw "both async and sync fetching of the wasm failed"}}catch(err){abort(err);}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw "failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else {if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response));},reject);})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["memory"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["__indirect_function_table"];addOnInit(Module["asm"]["__wasm_call_ctors"]);removeRunDependency();}addRunDependency();function receiveInstantiationResult(result){receiveInstance(result["instance"]);}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason);})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else {return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return {}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){getWasmTableEntry(func)();}else {getWasmTableEntry(func)(callback.arg);}}else {func(callback.arg===undefined?null:callback.arg);}}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr);}return func}function _abort(){abort("");}function _emscripten_get_heap_max(){return 2147483648}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num);}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=_emscripten_get_heap_max();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0;}else {buffer.push(curr);}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAP32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _setTempRet0(val){}var asmLibraryArg={"abort":_abort,"emscripten_get_heap_max":_emscripten_get_heap_max,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_resize_heap":_emscripten_resize_heap,"fd_close":_fd_close,"fd_seek":_fd_seek,"fd_write":_fd_write,"setTempRet0":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return (___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var _init=Module["_init"]=function(){return (_init=Module["_init"]=Module["asm"]["init"]).apply(null,arguments)};var _init_with_threads_count=Module["_init_with_threads_count"]=function(){return (_init_with_threads_count=Module["_init_with_threads_count"]=Module["asm"]["init_with_threads_count"]).apply(null,arguments)};var _get_threads_count=Module["_get_threads_count"]=function(){return (_get_threads_count=Module["_get_threads_count"]=Module["asm"]["get_threads_count"]).apply(null,arguments)};var _register_tensor=Module["_register_tensor"]=function(){return (_register_tensor=Module["_register_tensor"]=Module["asm"]["register_tensor"]).apply(null,arguments)};var _dispose_data=Module["_dispose_data"]=function(){return (_dispose_data=Module["_dispose_data"]=Module["asm"]["dispose_data"]).apply(null,arguments)};var _dispose=Module["_dispose"]=function(){return (_dispose=Module["_dispose"]=Module["asm"]["dispose"]).apply(null,arguments)};var _Abs=Module["_Abs"]=function(){return (_Abs=Module["_Abs"]=Module["asm"]["Abs"]).apply(null,arguments)};var _Add=Module["_Add"]=function(){return (_Add=Module["_Add"]=Module["asm"]["Add"]).apply(null,arguments)};var _AddN=Module["_AddN"]=function(){return (_AddN=Module["_AddN"]=Module["asm"]["AddN"]).apply(null,arguments)};var _All=Module["_All"]=function(){return (_All=Module["_All"]=Module["asm"]["All"]).apply(null,arguments)};var _Any=Module["_Any"]=function(){return (_Any=Module["_Any"]=Module["asm"]["Any"]).apply(null,arguments)};var _ArgMax=Module["_ArgMax"]=function(){return (_ArgMax=Module["_ArgMax"]=Module["asm"]["ArgMax"]).apply(null,arguments)};var _AvgPool=Module["_AvgPool"]=function(){return (_AvgPool=Module["_AvgPool"]=Module["asm"]["AvgPool"]).apply(null,arguments)};var _BatchMatMul=Module["_BatchMatMul"]=function(){return (_BatchMatMul=Module["_BatchMatMul"]=Module["asm"]["BatchMatMul"]).apply(null,arguments)};var _Ceil=Module["_Ceil"]=function(){return (_Ceil=Module["_Ceil"]=Module["asm"]["Ceil"]).apply(null,arguments)};var _ClipByValue=Module["_ClipByValue"]=function(){return (_ClipByValue=Module["_ClipByValue"]=Module["asm"]["ClipByValue"]).apply(null,arguments)};var _Conv2D=Module["_Conv2D"]=function(){return (_Conv2D=Module["_Conv2D"]=Module["asm"]["Conv2D"]).apply(null,arguments)};var _Conv2DBackpropInput=Module["_Conv2DBackpropInput"]=function(){return (_Conv2DBackpropInput=Module["_Conv2DBackpropInput"]=Module["asm"]["Conv2DBackpropInput"]).apply(null,arguments)};var _Cos=Module["_Cos"]=function(){return (_Cos=Module["_Cos"]=Module["asm"]["Cos"]).apply(null,arguments)};var _Cosh=Module["_Cosh"]=function(){return (_Cosh=Module["_Cosh"]=Module["asm"]["Cosh"]).apply(null,arguments)};var _CropAndResize=Module["_CropAndResize"]=function(){return (_CropAndResize=Module["_CropAndResize"]=Module["asm"]["CropAndResize"]).apply(null,arguments)};var _Cumprod=Module["_Cumprod"]=function(){return (_Cumprod=Module["_Cumprod"]=Module["asm"]["Cumprod"]).apply(null,arguments)};var _Cumsum=Module["_Cumsum"]=function(){return (_Cumsum=Module["_Cumsum"]=Module["asm"]["Cumsum"]).apply(null,arguments)};var _DepthToSpace=Module["_DepthToSpace"]=function(){return (_DepthToSpace=Module["_DepthToSpace"]=Module["asm"]["DepthToSpace"]).apply(null,arguments)};var _DepthwiseConv2dNative=Module["_DepthwiseConv2dNative"]=function(){return (_DepthwiseConv2dNative=Module["_DepthwiseConv2dNative"]=Module["asm"]["DepthwiseConv2dNative"]).apply(null,arguments)};var _Elu=Module["_Elu"]=function(){return (_Elu=Module["_Elu"]=Module["asm"]["Elu"]).apply(null,arguments)};var _Equal=Module["_Equal"]=function(){return (_Equal=Module["_Equal"]=Module["asm"]["Equal"]).apply(null,arguments)};var _Exp=Module["_Exp"]=function(){return (_Exp=Module["_Exp"]=Module["asm"]["Exp"]).apply(null,arguments)};var _FlipLeftRight=Module["_FlipLeftRight"]=function(){return (_FlipLeftRight=Module["_FlipLeftRight"]=Module["asm"]["FlipLeftRight"]).apply(null,arguments)};var _Floor=Module["_Floor"]=function(){return (_Floor=Module["_Floor"]=Module["asm"]["Floor"]).apply(null,arguments)};var _FloorDiv=Module["_FloorDiv"]=function(){return (_FloorDiv=Module["_FloorDiv"]=Module["asm"]["FloorDiv"]).apply(null,arguments)};var _FusedBatchNorm=Module["_FusedBatchNorm"]=function(){return (_FusedBatchNorm=Module["_FusedBatchNorm"]=Module["asm"]["FusedBatchNorm"]).apply(null,arguments)};var _FusedConv2D=Module["_FusedConv2D"]=function(){return (_FusedConv2D=Module["_FusedConv2D"]=Module["asm"]["FusedConv2D"]).apply(null,arguments)};var _FusedDepthwiseConv2D=Module["_FusedDepthwiseConv2D"]=function(){return (_FusedDepthwiseConv2D=Module["_FusedDepthwiseConv2D"]=Module["asm"]["FusedDepthwiseConv2D"]).apply(null,arguments)};var _Gather=Module["_Gather"]=function(){return (_Gather=Module["_Gather"]=Module["asm"]["Gather"]).apply(null,arguments)};var _GatherNd=Module["_GatherNd"]=function(){return (_GatherNd=Module["_GatherNd"]=Module["asm"]["GatherNd"]).apply(null,arguments)};var _Greater=Module["_Greater"]=function(){return (_Greater=Module["_Greater"]=Module["asm"]["Greater"]).apply(null,arguments)};var _GreaterEqual=Module["_GreaterEqual"]=function(){return (_GreaterEqual=Module["_GreaterEqual"]=Module["asm"]["GreaterEqual"]).apply(null,arguments)};var _LeakyRelu=Module["_LeakyRelu"]=function(){return (_LeakyRelu=Module["_LeakyRelu"]=Module["asm"]["LeakyRelu"]).apply(null,arguments)};var _Less=Module["_Less"]=function(){return (_Less=Module["_Less"]=Module["asm"]["Less"]).apply(null,arguments)};var _LessEqual=Module["_LessEqual"]=function(){return (_LessEqual=Module["_LessEqual"]=Module["asm"]["LessEqual"]).apply(null,arguments)};var _Log=Module["_Log"]=function(){return (_Log=Module["_Log"]=Module["asm"]["Log"]).apply(null,arguments)};var _LogicalAnd=Module["_LogicalAnd"]=function(){return (_LogicalAnd=Module["_LogicalAnd"]=Module["asm"]["LogicalAnd"]).apply(null,arguments)};var _Max=Module["_Max"]=function(){return (_Max=Module["_Max"]=Module["asm"]["Max"]).apply(null,arguments)};var _MaxPool=Module["_MaxPool"]=function(){return (_MaxPool=Module["_MaxPool"]=Module["asm"]["MaxPool"]).apply(null,arguments)};var _Maximum=Module["_Maximum"]=function(){return (_Maximum=Module["_Maximum"]=Module["asm"]["Maximum"]).apply(null,arguments)};var _Mean=Module["_Mean"]=function(){return (_Mean=Module["_Mean"]=Module["asm"]["Mean"]).apply(null,arguments)};var _Min=Module["_Min"]=function(){return (_Min=Module["_Min"]=Module["asm"]["Min"]).apply(null,arguments)};var _Minimum=Module["_Minimum"]=function(){return (_Minimum=Module["_Minimum"]=Module["asm"]["Minimum"]).apply(null,arguments)};var _MirrorPad=Module["_MirrorPad"]=function(){return (_MirrorPad=Module["_MirrorPad"]=Module["asm"]["MirrorPad"]).apply(null,arguments)};var _Multiply=Module["_Multiply"]=function(){return (_Multiply=Module["_Multiply"]=Module["asm"]["Multiply"]).apply(null,arguments)};var _Neg=Module["_Neg"]=function(){return (_Neg=Module["_Neg"]=Module["asm"]["Neg"]).apply(null,arguments)};var _NonMaxSuppressionV3=Module["_NonMaxSuppressionV3"]=function(){return (_NonMaxSuppressionV3=Module["_NonMaxSuppressionV3"]=Module["asm"]["NonMaxSuppressionV3"]).apply(null,arguments)};var _NonMaxSuppressionV4=Module["_NonMaxSuppressionV4"]=function(){return (_NonMaxSuppressionV4=Module["_NonMaxSuppressionV4"]=Module["asm"]["NonMaxSuppressionV4"]).apply(null,arguments)};var _NonMaxSuppressionV5=Module["_NonMaxSuppressionV5"]=function(){return (_NonMaxSuppressionV5=Module["_NonMaxSuppressionV5"]=Module["asm"]["NonMaxSuppressionV5"]).apply(null,arguments)};var _NotEqual=Module["_NotEqual"]=function(){return (_NotEqual=Module["_NotEqual"]=Module["asm"]["NotEqual"]).apply(null,arguments)};var _OneHot=Module["_OneHot"]=function(){return (_OneHot=Module["_OneHot"]=Module["asm"]["OneHot"]).apply(null,arguments)};var _PadV2=Module["_PadV2"]=function(){return (_PadV2=Module["_PadV2"]=Module["asm"]["PadV2"]).apply(null,arguments)};var _Pow=Module["_Pow"]=function(){return (_Pow=Module["_Pow"]=Module["asm"]["Pow"]).apply(null,arguments)};var _Prelu=Module["_Prelu"]=function(){return (_Prelu=Module["_Prelu"]=Module["asm"]["Prelu"]).apply(null,arguments)};var _Prod=Module["_Prod"]=function(){return (_Prod=Module["_Prod"]=Module["asm"]["Prod"]).apply(null,arguments)};var _RealDiv=Module["_RealDiv"]=function(){return (_RealDiv=Module["_RealDiv"]=Module["asm"]["RealDiv"]).apply(null,arguments)};var _Relu=Module["_Relu"]=function(){return (_Relu=Module["_Relu"]=Module["asm"]["Relu"]).apply(null,arguments)};var _Relu6=Module["_Relu6"]=function(){return (_Relu6=Module["_Relu6"]=Module["asm"]["Relu6"]).apply(null,arguments)};var _ResizeBilinear=Module["_ResizeBilinear"]=function(){return (_ResizeBilinear=Module["_ResizeBilinear"]=Module["asm"]["ResizeBilinear"]).apply(null,arguments)};var _Reverse=Module["_Reverse"]=function(){return (_Reverse=Module["_Reverse"]=Module["asm"]["Reverse"]).apply(null,arguments)};var _RotateWithOffset=Module["_RotateWithOffset"]=function(){return (_RotateWithOffset=Module["_RotateWithOffset"]=Module["asm"]["RotateWithOffset"]).apply(null,arguments)};var _Round=Module["_Round"]=function(){return (_Round=Module["_Round"]=Module["asm"]["Round"]).apply(null,arguments)};var _Rsqrt=Module["_Rsqrt"]=function(){return (_Rsqrt=Module["_Rsqrt"]=Module["asm"]["Rsqrt"]).apply(null,arguments)};var _ScatterNd=Module["_ScatterNd"]=function(){return (_ScatterNd=Module["_ScatterNd"]=Module["asm"]["ScatterNd"]).apply(null,arguments)};var _SelectV2=Module["_SelectV2"]=function(){return (_SelectV2=Module["_SelectV2"]=Module["asm"]["SelectV2"]).apply(null,arguments)};var _Sigmoid=Module["_Sigmoid"]=function(){return (_Sigmoid=Module["_Sigmoid"]=Module["asm"]["Sigmoid"]).apply(null,arguments)};var _Sin=Module["_Sin"]=function(){return (_Sin=Module["_Sin"]=Module["asm"]["Sin"]).apply(null,arguments)};var _Softmax=Module["_Softmax"]=function(){return (_Softmax=Module["_Softmax"]=Module["asm"]["Softmax"]).apply(null,arguments)};var _SparseFillEmptyRows=Module["_SparseFillEmptyRows"]=function(){return (_SparseFillEmptyRows=Module["_SparseFillEmptyRows"]=Module["asm"]["SparseFillEmptyRows"]).apply(null,arguments)};var _SparseReshape=Module["_SparseReshape"]=function(){return (_SparseReshape=Module["_SparseReshape"]=Module["asm"]["SparseReshape"]).apply(null,arguments)};var _SparseSegmentReduction=Module["_SparseSegmentReduction"]=function(){return (_SparseSegmentReduction=Module["_SparseSegmentReduction"]=Module["asm"]["SparseSegmentReduction"]).apply(null,arguments)};var _Sqrt=Module["_Sqrt"]=function(){return (_Sqrt=Module["_Sqrt"]=Module["asm"]["Sqrt"]).apply(null,arguments)};var _Square=Module["_Square"]=function(){return (_Square=Module["_Square"]=Module["asm"]["Square"]).apply(null,arguments)};var _SquaredDifference=Module["_SquaredDifference"]=function(){return (_SquaredDifference=Module["_SquaredDifference"]=Module["asm"]["SquaredDifference"]).apply(null,arguments)};var _Step=Module["_Step"]=function(){return (_Step=Module["_Step"]=Module["asm"]["Step"]).apply(null,arguments)};var _StridedSlice=Module["_StridedSlice"]=function(){return (_StridedSlice=Module["_StridedSlice"]=Module["asm"]["StridedSlice"]).apply(null,arguments)};var _Sub=Module["_Sub"]=function(){return (_Sub=Module["_Sub"]=Module["asm"]["Sub"]).apply(null,arguments)};var _Sum=Module["_Sum"]=function(){return (_Sum=Module["_Sum"]=Module["asm"]["Sum"]).apply(null,arguments)};var _Tan=Module["_Tan"]=function(){return (_Tan=Module["_Tan"]=Module["asm"]["Tan"]).apply(null,arguments)};var _Tanh=Module["_Tanh"]=function(){return (_Tanh=Module["_Tanh"]=Module["asm"]["Tanh"]).apply(null,arguments)};var _Tile=Module["_Tile"]=function(){return (_Tile=Module["_Tile"]=Module["asm"]["Tile"]).apply(null,arguments)};var _TopK=Module["_TopK"]=function(){return (_TopK=Module["_TopK"]=Module["asm"]["TopK"]).apply(null,arguments)};var _Transform=Module["_Transform"]=function(){return (_Transform=Module["_Transform"]=Module["asm"]["Transform"]).apply(null,arguments)};var _Transpose=Module["_Transpose"]=function(){return (_Transpose=Module["_Transpose"]=Module["asm"]["Transpose"]).apply(null,arguments)};var __FusedMatMul=Module["__FusedMatMul"]=function(){return (__FusedMatMul=Module["__FusedMatMul"]=Module["asm"]["_FusedMatMul"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return (_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var _free=Module["_free"]=function(){return (_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return (___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return (_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["emscripten_main_thread_process_queued_calls"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return (stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return (stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return (stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var dynCall_iijjiiii=Module["dynCall_iijjiiii"]=function(){return (dynCall_iijjiiii=Module["dynCall_iijjiiii"]=Module["asm"]["dynCall_iijjiiii"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return (dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};Module["cwrap"]=cwrap;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status;}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller;};function run(args){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun();}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("");},1);doRun();},1);}else {doRun();}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()();}}run();var listenersAdded;if(beforeListeners){listenersAdded={uncaughtException:process.listeners("uncaughtException").filter(function(listener){return !beforeListeners.uncaughtException.indexOf(listener)>-1}),unhandledRejection:process.listeners("unhandledRejection").filter(function(listener){return !beforeListeners.unhandledRejection.indexOf(listener)>-1})};}var actualModule;if(typeof WasmBackendModule!=="undefined"){actualModule=WasmBackendModule;}else if(typeof WasmBackendModuleThreadedSimd!=="undefined"){actualModule=WasmBackendModuleThreadedSimd;}else {throw new Error("Could not find wasm module in post.js")}if(listenersAdded){var tmpDispose=actualModule["_dispose"];actualModule["_dispose"]=function(){tmpDispose();listenersAdded.uncaughtException.forEach(function(listener){process.removeListener("uncaughtException",listener);});listenersAdded.unhandledRejection.forEach(function(listener){process.removeListener("unhandledRejection",listener);});};} return WasmBackendModule.ready } ); })(); module.exports = WasmBackendModule; }); var BackendWasm = /** @class */ (function (_super) { __extends(BackendWasm, _super); function BackendWasm(wasm) { var _this = _super.call(this) || this; _this.wasm = wasm; // 0 is reserved for null data ids. _this.dataIdNextNumber = 1; _this.wasm.tfjs.initWithThreadsCount(threadsCount); actualThreadsCount = _this.wasm.tfjs.getThreadsCount(); _this.dataIdMap = new tfjsCore.DataStorage(_this, tfjsCore.engine()); return _this; } BackendWasm.prototype.write = function (values, shape, dtype) { var dataId = { id: this.dataIdNextNumber++ }; this.move(dataId, values, shape, dtype, 1); return dataId; }; BackendWasm.prototype.numDataIds = function () { return this.dataIdMap.numDataIds(); }; BackendWasm.prototype.time = function (f) { return __awaiter(this, void 0, void 0, function () { var start, kernelMs; return __generator(this, function (_a) { start = tfjsCore.util.now(); f(); kernelMs = tfjsCore.util.now() - start; return [2 /*return*/, { kernelMs: kernelMs }]; }); }); }; BackendWasm.prototype.move = function (dataId, values, shape, dtype, refCount) { var id = this.dataIdNextNumber++; if (dtype === 'string') { var stringBytes = values; this.dataIdMap.set(dataId, { id: id, stringBytes: stringBytes, shape: shape, dtype: dtype, memoryOffset: null, refCount: refCount }); return; } var size = tfjsCore.util.sizeFromShape(shape); var numBytes = size * tfjsCore.util.bytesPerElement(dtype); var memoryOffset = this.wasm._malloc(numBytes); this.dataIdMap.set(dataId, { id: id, memoryOffset: memoryOffset, shape: shape, dtype: dtype, refCount: refCount }); this.wasm.tfjs.registerTensor(id, size, memoryOffset); if (values != null) { this.wasm.HEAPU8.set(new Uint8Array(values.buffer, values.byteOffset, numBytes), memoryOffset); } }; BackendWasm.prototype.read = function (dataId) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, this.readSync(dataId)]; }); }); }; BackendWasm.prototype.readSync = function (dataId, start, end) { var _a = this.dataIdMap.get(dataId), memoryOffset = _a.memoryOffset, dtype = _a.dtype, shape = _a.shape, stringBytes = _a.stringBytes; if (dtype === 'string') { // Slice all elements. if ((start == null || start === 0) && (end == null || end >= stringBytes.length)) { return stringBytes; } return stringBytes.slice(start, end); } start = start || 0; end = end || tfjsCore.util.sizeFromShape(shape); var bytesPerElement = tfjsCore.util.bytesPerElement(dtype); var bytes = this.wasm.HEAPU8.slice(memoryOffset + start * bytesPerElement, memoryOffset + end * bytesPerElement); return typedArrayFromBuffer(bytes.buffer, dtype); }; /** * Dispose the memory if the dataId has 0 refCount. Return true if the memory * is released, false otherwise. * @param dataId * @oaram force Optional, remove the data regardless of refCount */ BackendWasm.prototype.disposeData = function (dataId, force) { if (force === void 0) { force = false; } if (this.dataIdMap.has(dataId)) { var data = this.dataIdMap.get(dataId); data.refCount--; if (!force && data.refCount > 0) { return false; } this.wasm._free(data.memoryOffset); this.wasm.tfjs.disposeData(data.id); this.dataIdMap.delete(dataId); } return true; }; /** Return refCount of a `TensorData`. */ BackendWasm.prototype.refCount = function (dataId) { if (this.dataIdMap.has(dataId)) { var tensorData = this.dataIdMap.get(dataId); return tensorData.refCount; } return 0; }; BackendWasm.prototype.incRef = function (dataId) { var data = this.dataIdMap.get(dataId); if (data != null) { data.refCount++; } }; BackendWasm.prototype.floatPrecision = function () { return 32; }; // Returns the memory offset of a tensor. Useful for debugging and unit // testing. BackendWasm.prototype.getMemoryOffset = function (dataId) { return this.dataIdMap.get(dataId).memoryOffset; }; BackendWasm.prototype.dispose = function () { this.wasm.tfjs.dispose(); if ('PThread' in this.wasm) { this.wasm.PThread.terminateAllThreads(); } this.wasm = null; }; BackendWasm.prototype.memory = function () { return { unreliable: false }; }; /** * Make a tensor info for the output of an op. If `memoryOffset` is not * present, this method allocates memory on the WASM heap. If `memoryOffset` * is present, the memory was allocated elsewhere (in c++) and we just record * the pointer where that memory lives. */ BackendWasm.prototype.makeOutput = function (shape, dtype, memoryOffset) { var dataId; if (memoryOffset == null) { dataId = this.write(null /* values */, shape, dtype); } else { var id = this.dataIdNextNumber++; dataId = { id: id }; this.dataIdMap.set(dataId, { id: id, memoryOffset: memoryOffset, shape: shape, dtype: dtype, refCount: 1 }); var size = tfjsCore.util.sizeFromShape(shape); this.wasm.tfjs.registerTensor(id, size, memoryOffset); } return { dataId: dataId, shape: shape, dtype: dtype }; }; BackendWasm.prototype.typedArrayFromHeap = function (_a) { var shape = _a.shape, dtype = _a.dtype, dataId = _a.dataId; var buffer = this.wasm.HEAPU8.buffer; var memoryOffset = this.dataIdMap.get(dataId).memoryOffset; var size = tfjsCore.util.sizeFromShape(shape); switch (dtype) { case 'float32': return new Float32Array(buffer, memoryOffset, size); case 'int32': return new Int32Array(buffer, memoryOffset, size); case 'bool': return new Uint8Array(buffer, memoryOffset, size); default: throw new Error("Unknown dtype " + dtype); } }; return BackendWasm; }(tfjsCore.KernelBackend)); function createInstantiateWasmFunc(path) { // this will be replace by rollup plugin patchWechatWebAssembly in // minprogram's output. // tslint:disable-next-line:no-any return function (imports, callback) { tfjsCore.util.fetch(path, { credentials: 'same-origin' }).then(function (response) { if (!response['ok']) { imports.env.a("failed to load wasm binary file at '" + path + "'"); } response.arrayBuffer().then(function (binary) { WebAssembly.instantiate(binary, imports).then(function (output) { callback(output.instance, output.module); }); }); }); return {}; }; } /** * Returns the path of the WASM binary. * @param simdSupported whether SIMD is supported * @param threadsSupported whether multithreading is supported * @param wasmModuleFolder the directory containing the WASM binaries. */ function getPathToWasmBinary(simdSupported, threadsSupported, wasmModuleFolder) { if (wasmPath != null) { // If wasmPath is defined, the user has supplied a full path to // the vanilla .wasm binary. return wasmPath; } var path = 'tfjs-backend-wasm.wasm'; if (simdSupported && threadsSupported) { path = 'tfjs-backend-wasm-threaded-simd.wasm'; } else if (simdSupported) { path = 'tfjs-backend-wasm-simd.wasm'; } if (wasmFileMap != null) { if (wasmFileMap[path] != null) { return wasmFileMap[path]; } } return wasmModuleFolder + path; } /** * Initializes the wasm module and creates the js <--> wasm bridge. * * NOTE: We wrap the wasm module in a object with property 'wasm' instead of * returning Promise to avoid freezing Chrome (last tested * in Chrome 76). */ function init() { return __awaiter(this, void 0, void 0, function () { var _a, simdSupported, threadsSupported; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, Promise.all([ tfjsCore.env().getAsync('WASM_HAS_SIMD_SUPPORT'), tfjsCore.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT') ])]; case 1: _a = _b.sent(), simdSupported = _a[0], threadsSupported = _a[1]; return [2 /*return*/, new Promise(function (resolve, reject) { var factoryConfig = {}; /** * This function overrides the Emscripten module locateFile utility. * @param path The relative path to the file that needs to be loaded. * @param prefix The path to the main JavaScript file's directory. */ factoryConfig.locateFile = function (path, prefix) { if (path.endsWith('.worker.js')) { // Escape '\n' because Blob will turn it into a newline. // There should be a setting for this, but 'endings: "native"' does // not seem to work. var response = wasmWorkerContents.replace(/\n/g, '\\n'); var blob = new Blob([response], { type: 'application/javascript' }); return URL.createObjectURL(blob); } if (path.endsWith('.wasm')) { return getPathToWasmBinary(simdSupported, threadsSupported, wasmPathPrefix != null ? wasmPathPrefix : prefix); } return prefix + path; }; // Use the instantiateWasm override when system fetch is not available. // Reference: // https://github.com/emscripten-core/emscripten/blob/2bca083cbbd5a4133db61fbd74d04f7feecfa907/tests/manual_wasm_instantiate.html#L170 if (customFetch) { factoryConfig.instantiateWasm = createInstantiateWasmFunc(getPathToWasmBinary(simdSupported, threadsSupported, wasmPathPrefix != null ? wasmPathPrefix : '')); } var initialized = false; factoryConfig.onAbort = function () { if (initialized) { // Emscripten already called console.warn so no need to double log. return; } if (initAborted) { // Emscripten calls `onAbort` twice, resulting in double error // messages. return; } initAborted = true; var rejectMsg = 'Make sure the server can serve the `.wasm` file relative to the ' + 'bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers'; reject({ message: rejectMsg }); }; var wasm; // If `wasmPath` has been defined we must initialize the vanilla module. if (threadsSupported && simdSupported && wasmPath == null) { factoryConfig.mainScriptUrlOrBlob = new Blob(["var WasmBackendModuleThreadedSimd = " + tfjsBackendWasmThreadedSimd.toString()], { type: 'text/javascript' }); wasm = tfjsBackendWasmThreadedSimd(factoryConfig); } else { // The wasmFactory works for both vanilla and SIMD binaries. wasm = tfjsBackendWasm(factoryConfig); } // The WASM module has been successfully created by the factory. // Any error will be caught by the onAbort callback defined above. wasm.then(function (module) { initialized = true; initAborted = false; var voidReturnType = null; // Using the tfjs namespace to avoid conflict with emscripten's API. module.tfjs = { init: module.cwrap('init', null, []), initWithThreadsCount: module.cwrap('init_with_threads_count', null, ['number']), getThreadsCount: module.cwrap('get_threads_count', 'number', []), registerTensor: module.cwrap('register_tensor', null, [ 'number', 'number', 'number', ]), disposeData: module.cwrap('dispose_data', voidReturnType, ['number']), dispose: module.cwrap('dispose', voidReturnType, []), }; resolve({ wasm: module }); }); })]; } }); }); } function typedArrayFromBuffer(buffer, dtype) { switch (dtype) { case 'float32': return new Float32Array(buffer); case 'int32': return new Int32Array(buffer); case 'bool': return new Uint8Array(buffer); default: throw new Error("Unknown dtype " + dtype); } } var wasmBinaryNames = [ 'tfjs-backend-wasm.wasm', 'tfjs-backend-wasm-simd.wasm', 'tfjs-backend-wasm-threaded-simd.wasm' ]; var wasmPath = null; var wasmPathPrefix = null; var wasmFileMap = {}; var initAborted = false; var customFetch = false; /** * @deprecated Use `setWasmPaths` instead. * Sets the path to the `.wasm` file which will be fetched when the wasm * backend is initialized. See * https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers * for more details. * @param path wasm file path or url * @param usePlatformFetch optional boolean to use platform fetch to download * the wasm file, default to false. * * @doc {heading: 'Environment', namespace: 'wasm'} */ function setWasmPath(path, usePlatformFetch) { if (usePlatformFetch === void 0) { usePlatformFetch = false; } tfjsCore.deprecationWarn('setWasmPath has been deprecated in favor of setWasmPaths and' + ' will be removed in a future release.'); if (initAborted) { throw new Error('The WASM backend was already initialized. Make sure you call ' + '`setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`'); } wasmPath = path; customFetch = usePlatformFetch; } /** * Configures the locations of the WASM binaries. * * ```js * setWasmPaths({ * 'tfjs-backend-wasm.wasm': 'renamed.wasm', * 'tfjs-backend-wasm-simd.wasm': 'renamed-simd.wasm', * 'tfjs-backend-wasm-threaded-simd.wasm': 'renamed-threaded-simd.wasm' * }); * tf.setBackend('wasm'); * ``` * * @param prefixOrFileMap This can be either a string or object: * - (string) The path to the directory where the WASM binaries are located. * Note that this prefix will be used to load each binary (vanilla, * SIMD-enabled, threading-enabled, etc.). * - (object) Mapping from names of WASM binaries to custom * full paths specifying the locations of those binaries. This is useful if * your WASM binaries are not all located in the same directory, or if your * WASM binaries have been renamed. * @param usePlatformFetch optional boolean to use platform fetch to download * the wasm file, default to false. * * @doc {heading: 'Environment', namespace: 'wasm'} */ function setWasmPaths(prefixOrFileMap, usePlatformFetch) { if (usePlatformFetch === void 0) { usePlatformFetch = false; } if (initAborted) { throw new Error('The WASM backend was already initialized. Make sure you call ' + '`setWasmPaths()` before you call `tf.setBackend()` or ' + '`tf.ready()`'); } if (typeof prefixOrFileMap === 'string') { wasmPathPrefix = prefixOrFileMap; } else { wasmFileMap = prefixOrFileMap; var missingPaths = wasmBinaryNames.filter(function (name) { return wasmFileMap[name] == null; }); if (missingPaths.length > 0) { throw new Error("There were no entries found for the following binaries: " + (missingPaths.join(',') + ". Please either call setWasmPaths with a ") + "map providing a path for each binary, or with a string indicating " + "the directory where all the binaries can be found."); } } customFetch = usePlatformFetch; } var threadsCount = -1; var actualThreadsCount = -1; /** * Sets the number of threads that will be used by XNNPACK to create * threadpool (default to the number of logical CPU cores). * * This must be called before calling `tf.setBackend('wasm')`. */ function setThreadsCount(numThreads) { threadsCount = numThreads; } /** * Gets the actual threads count that is used by XNNPACK. * * It is set after the backend is intialized. */ function getThreadsCount() { if (actualThreadsCount === -1) { throw new Error("WASM backend not initialized."); } return actualThreadsCount; } /** @license See the LICENSE file. */ // This code is auto-generated, do not modify this file! var version = '3.16.0'; /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var _this$1 = undefined; var WASM_PRIORITY = 2; tfjsCore.registerBackend('wasm', function () { return __awaiter(_this$1, void 0, void 0, function () { var wasm; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, init()]; case 1: wasm = (_a.sent()).wasm; return [2 /*return*/, new BackendWasm(wasm)]; } }); }); }, WASM_PRIORITY); exports.BackendWasm = BackendWasm; exports.getThreadsCount = getThreadsCount; exports.setThreadsCount = setThreadsCount; exports.setWasmPath = setWasmPath; exports.setWasmPaths = setWasmPaths; exports.version_wasm = version; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=tf-backend-wasm.js.map