From d13586f54980b7ad14744b9c2ee260e9b573ada7 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 11 Sep 2021 11:11:38 -0400 Subject: [PATCH] reduce bundle size --- CHANGELOG.md | 122 +- README.md | 2 - build.json | 141 +- dist/face-api.esm-nobundle.js | 1 - dist/face-api.esm-nobundle.js.map | 7 - dist/face-api.js | 62403 +--------------------------- dist/face-api.js.map | 7 - dist/face-api.node-cpu.js | 4726 --- dist/face-api.node-cpu.js.map | 7 - dist/face-api.node-gpu.js | 1 - dist/face-api.node-gpu.js.map | 7 - dist/face-api.node.js | 1 - dist/face-api.node.js.map | 7 - package.json | 19 +- 14 files changed, 1714 insertions(+), 65737 deletions(-) delete mode 100644 dist/face-api.esm-nobundle.js.map delete mode 100644 dist/face-api.js.map delete mode 100644 dist/face-api.node-cpu.js delete mode 100644 dist/face-api.node-cpu.js.map delete mode 100644 dist/face-api.node-gpu.js.map delete mode 100644 dist/face-api.node.js.map diff --git a/CHANGELOG.md b/CHANGELOG.md index 27ab43e..120ba49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,19 +1,19 @@ -# @vladmandic/face-api +# packageJson - Version: **1.5.2** - Description: **FaceAPI: AI-powered Face Detection & Rotation Tracking, Face Description & Recognition, Age & Gender & Emotion Prediction for Browser and NodeJS using TensorFlow/JS** + Version: **undefined** + Description: **undefined** - Author: **Vladimir Mandic ** - License: **MIT** + Author: **undefined** + License: **undefined** Repository: **** ## Changelog +### **HEAD -> master** 2021/09/10 mandic00@live.com + + ### **1.5.2** 2021/09/10 mandic00@live.com - -### **origin/master** 2021/09/08 mandic00@live.com - - redesign build platform ### **1.5.1** 2021/09/08 mandic00@live.com @@ -123,61 +123,111 @@ - add badges - optimize for npm -- 0.30.6 + +### **0.30.6** 2021/03/08 mandic00@live.com + - added typings for face angle - disable landmark printing -- 0.30.5 + +### **0.30.5** 2021/03/07 mandic00@live.com + - enabled live demo on gitpages -- 0.30.4 + +### **0.30.4** 2021/03/07 mandic00@live.com + - added face angle calculations - added documentation - package update -- 0.30.3 -- 0.30.2 -- 0.30.1 -- 0.13.3 + +### **0.30.3** 2021/03/04 mandic00@live.com + + +### **0.30.2** 2021/02/26 mandic00@live.com + + +### **0.30.1** 2021/02/25 mandic00@live.com + + +### **0.13.3** 2021/02/21 mandic00@live.com + - added note-cpu target - merge pull request #39 from xemle/feature/node-cpu - add node-cpu build for non supported systems of libtensorflow -- 0.13.2 -- 0.13.1 -- 0.12.10 -- exception handling -- 0.12.9 -- exception handling -- 0.12.8 + +### **0.13.2** 2021/02/20 mandic00@live.com + + +### **0.13.1** 2021/02/20 mandic00@live.com + + +### **0.12.10** 2021/02/20 mandic00@live.com + - exception handling +### **0.12.9** 2021/02/20 mandic00@live.com + + +### **0.12.8** 2021/02/20 mandic00@live.com + + ### **0.12.7** 2021/02/17 mandic00@live.com - 0.12.7 -- 0.12.6 -- 0.12.5 -- 0.12.4 -- 0.12.3 -- 0.12.2 + +### **0.12.6** 2021/02/13 mandic00@live.com + + +### **0.12.5** 2021/02/12 mandic00@live.com + + +### **0.12.4** 2021/02/06 mandic00@live.com + + +### **0.12.3** 2021/02/06 mandic00@live.com + + +### **0.12.2** 2021/02/02 mandic00@live.com + ### **update for tfjs 3.0.0** 2021/01/29 mandic00@live.com -- 0.12.1 + +### **0.12.1** 2021/01/29 mandic00@live.com + - rebuild -- 0.11.6 + +### **0.11.6** 2021/01/24 mandic00@live.com + - add check for null face descriptor - merge pull request #34 from patrickhulce/patch-1 - fix: return empty descriptor for zero-sized faces -- 0.11.5 -- 0.11.4 -- 0.11.3 + +### **0.11.5** 2021/01/22 mandic00@live.com + + +### **0.11.4** 2021/01/22 mandic00@live.com + + +### **0.11.3** 2021/01/20 mandic00@live.com + - fix typo - enable full minification -- 0.11.2 + +### **0.11.2** 2021/01/12 mandic00@live.com + - full rebuild -- 0.11.1 + +### **0.11.1** 2021/01/10 mandic00@live.com + - added live webcam demo -- 0.10.2 + +### **0.10.2** 2021/01/03 mandic00@live.com + - ts linting - version bump -- 0.10.1 + +### **0.10.1** 2020/12/23 mandic00@live.com + - full re-lint and typings generation - rebuild diff --git a/README.md b/README.md index be0ea08..dc66d97 100644 --- a/README.md +++ b/README.md @@ -133,8 +133,6 @@ Simply include latest version of `FaceAPI` directly from a CDN in your HTML: *without* TFJS pre-bundled - `dist/face-api.node-gpu.js`: CommonJS format for server-side NodeJS execution *without* TFJS pre-bundled and optimized for CUDA GPU acceleration -- `dist/face-api.node-cpu.js`: CommonJS format for server-side NodeJS execution - *without* TFJS pre-bundled and using JS engine for platforms where tensorflow binary library version is not available Defaults are: diff --git a/build.json b/build.json index 06da4ff..91d2770 100644 --- a/build.json +++ b/build.json @@ -3,23 +3,23 @@ "enabled": false, "debug": false, "console": true, - "output": "dev-server.log" + "output": "build.log" + }, + "profiles": { + "production": ["clean", "compile", "typings", "typedoc", "lint", "changelog"], + "development": ["serve", "watch", "compile"] }, "clean": { - "enabled": true, "locations": ["dist/*", "types/*", "typedoc/*"] }, "lint": { - "enabled": true, "locations": [ "src/**" ], "rules": { } }, "changelog": { - "enabled": true, "log": "CHANGELOG.md" }, "serve": { - "enabled": true, "sslKey": "cert/https.key", "sslCrt": "cert/https.crt", "httpPort": 8000, @@ -29,98 +29,89 @@ "defaultFile": "index.html" }, "build": { - "enabled": true, "global": { "target": "es2018", - "sourcemap": true, + "sourcemap": false, "banner": { "js": "/*\n Face-API\n homepage: \n author: '\n*/\n" } }, - "production": { - "minify": false - }, - "development": { - "minify": false - }, "targets": [ { - "platform": "node", - "format": "cjs", - "input": "src/tfjs/tf-node.ts", - "output": "dist/tfjs.esm.js", - "external": ["@tensorflow"] + "name": "tfjs/node/cpu", + "platform": "node", + "format": "cjs", + "input": "src/tfjs/tf-node.ts", + "output": "dist/tfjs.esm.js", + "external": ["@tensorflow"] }, { - "platform": "node", - "format": "cjs", - "input": "src/index.ts", - "output": "dist/face-api.node.js", - "external": ["@tensorflow"] + "name": "faceapi/node/cpu", + "platform": "node", + "format": "cjs", + "input": "src/index.ts", + "output": "dist/face-api.node.js", + "external": ["@tensorflow"] }, { - "platform": "node", - "format": "cjs", - "input": "src/tfjs/tf-node-gpu.ts", - "output": "dist/tfjs.esm.js", - "external": ["@tensorflow"] + "name": "tfjs/node/gpu", + "platform": "node", + "format": "cjs", + "input": "src/tfjs/tf-node-gpu.ts", + "output": "dist/tfjs.esm.js", + "external": ["@tensorflow"] }, { - "platform": "node", - "format": "cjs", - "input": "src/index.ts", - "output": "dist/face-api.node-gpu.js", - "external": ["@tensorflow"] + "name": "faceapi/node/gpu", + "platform": "node", + "format": "cjs", + "input": "src/index.ts", + "output": "dist/face-api.node-gpu.js", + "external": ["@tensorflow"] }, { - "platform": "node", - "format": "cjs", - "input": "src/tfjs/tf-node-cpu.ts", - "output": "dist/tfjs.esm.js", - "external": ["@tensorflow"] + "name": "tfjs/browser/esm/nobundle", + "platform": "browser", + "format": "esm", + "input": "src/tfjs/tf-browser.ts", + "output": "dist/tfjs.esm.js", + "external": ["fs","buffer","util","os","@tensorflow"] }, { - "platform": "node", - "format": "cjs", - "input": "src/index.ts", - "output": "dist/face-api.node-cpu.js", - "external": ["@tensorflow"] + "name": "faceapi/browser/esm/nobundle", + "platform": "browser", + "format": "esm", + "input": "src/index.ts", + "output": "dist/face-api.esm-nobundle.js", + "external": ["fs","buffer","util","os","@tensorflow","tfjs.esm.js"] }, { - "platform": "browser", - "format": "esm", - "input": "src/tfjs/tf-browser.ts", - "output": "dist/tfjs.esm.js", - "external": ["fs","buffer","util","os","@tensorflow"] + "name": "tfjs/browser/esm/bundle", + "platform": "browser", + "format": "esm", + "sourcemap": true, + "input": "src/tfjs/tf-browser.ts", + "output": "dist/tfjs.esm.js", + "external": ["fs","buffer","util","os"] }, { - "platform": "browser", - "format": "esm", - "input": "src/index.ts", - "output": "dist/face-api.esm-nobundle.js", - "external": ["fs","buffer","util","os","@tensorflow","tfjs.esm.js"] + "name": "faceapi/browser/iife/bundle", + "platform": "browser", + "format": "iife", + "globalName": "faceapi", + "minify": true, + "input": "src/index.ts", + "output": "dist/face-api.js", + "external": ["fs","buffer","util","os"] }, { - "platform": "browser", - "format": "esm", - "input": "src/tfjs/tf-browser.ts", - "output": "dist/tfjs.esm.js", - "external": ["fs","buffer","util","os"] - }, - { - "platform": "browser", - "format": "iife", - "globalName": "faceapi", - "input": "src/index.ts", - "output": "dist/face-api.js", - "external": ["fs","buffer","util","os"] - }, - { - "platform": "browser", - "format": "esm", - "input": "src/index.ts", - "output": "dist/face-api.esm.js", - "external": ["fs","buffer","util","os"], - "typings": "types", - "typedoc": "typedoc" + "name": "faceapi/browser/esm/bundle", + "platform": "browser", + "format": "esm", + "sourcemap": true, + "input": "src/index.ts", + "output": "dist/face-api.esm.js", + "external": ["fs","buffer","util","os"], + "typings": "types", + "typedoc": "typedoc" } ] }, diff --git a/dist/face-api.esm-nobundle.js b/dist/face-api.esm-nobundle.js index 5cfae1c..e2aa70b 100644 --- a/dist/face-api.esm-nobundle.js +++ b/dist/face-api.esm-nobundle.js @@ -4520,4 +4520,3 @@ export { validateConfig, version3 as version }; -//# sourceMappingURL=face-api.esm-nobundle.js.map diff --git a/dist/face-api.esm-nobundle.js.map b/dist/face-api.esm-nobundle.js.map deleted file mode 100644 index f2e49c3..0000000 --- a/dist/face-api.esm-nobundle.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/tfjs/tf-browser.ts", "../src/draw/index.ts", "../src/draw/drawContour.ts", "../src/utils/index.ts", "../src/classes/Dimensions.ts", "../src/classes/Point.ts", "../src/classes/Box.ts", "../src/classes/BoundingBox.ts", "../src/classes/ObjectDetection.ts", "../src/classes/FaceDetection.ts", "../src/ops/iou.ts", "../src/ops/minBbox.ts", "../src/ops/nonMaxSuppression.ts", "../src/ops/normalize.ts", "../src/ops/padToSquare.ts", "../src/ops/shuffleArray.ts", "../src/ops/index.ts", "../src/classes/Rect.ts", "../src/classes/FaceLandmarks.ts", "../src/classes/FaceLandmarks5.ts", "../src/classes/FaceLandmarks68.ts", "../src/classes/FaceMatch.ts", "../src/classes/LabeledBox.ts", "../src/classes/LabeledFaceDescriptors.ts", "../src/classes/PredictedBox.ts", "../src/factories/WithFaceDetection.ts", "../src/env/createBrowserEnv.ts", "../src/env/createFileSystem.ts", "../src/env/createNodejsEnv.ts", "../src/env/isBrowser.ts", "../src/env/isNodejs.ts", "../src/env/index.ts", "../src/dom/resolveInput.ts", "../src/dom/getContext2dOrThrow.ts", "../src/draw/DrawTextField.ts", "../src/draw/DrawBox.ts", "../src/draw/drawDetections.ts", "../src/dom/isMediaLoaded.ts", "../src/dom/awaitMediaLoaded.ts", "../src/dom/bufferToImage.ts", "../src/dom/getMediaDimensions.ts", "../src/dom/createCanvas.ts", "../src/dom/imageTensorToCanvas.ts", "../src/dom/isMediaElement.ts", "../src/dom/imageToSquare.ts", "../src/dom/NetInput.ts", "../src/dom/toNetInput.ts", "../src/dom/extractFaces.ts", "../src/dom/extractFaceTensors.ts", "../src/dom/fetchOrThrow.ts", "../src/dom/fetchImage.ts", "../src/dom/fetchJson.ts", "../src/dom/fetchNetWeights.ts", "../src/dom/bufferToVideo.ts", "../src/dom/fetchVideo.ts", "../src/common/getModelUris.ts", "../src/dom/loadWeightMap.ts", "../src/dom/matchDimensions.ts", "../src/NeuralNetwork.ts", "../src/common/depthwiseSeparableConv.ts", "../src/faceFeatureExtractor/denseBlock.ts", "../src/common/convLayer.ts", "../src/common/disposeUnusedWeightTensors.ts", "../src/common/extractConvParamsFactory.ts", "../src/common/extractFCParamsFactory.ts", "../src/common/types.ts", "../src/common/extractSeparableConvParamsFactory.ts", "../src/common/extractWeightEntryFactory.ts", "../src/common/extractWeightsFactory.ts", "../src/faceFeatureExtractor/extractorsFactory.ts", "../src/faceFeatureExtractor/extractParams.ts", "../src/common/loadConvParamsFactory.ts", "../src/faceFeatureExtractor/loadParamsFactory.ts", "../src/faceFeatureExtractor/extractParamsFromWeightMap.ts", "../src/faceFeatureExtractor/FaceFeatureExtractor.ts", "../src/common/fullyConnectedLayer.ts", "../src/faceProcessor/extractParams.ts", "../src/faceProcessor/extractParamsFromWeightMap.ts", "../src/faceProcessor/util.ts", "../src/faceProcessor/FaceProcessor.ts", "../src/faceExpressionNet/FaceExpressions.ts", "../src/faceExpressionNet/FaceExpressionNet.ts", "../src/factories/WithFaceExpressions.ts", "../src/draw/drawFaceExpressions.ts", "../src/factories/WithFaceLandmarks.ts", "../src/draw/DrawFaceLandmarks.ts", "../src/xception/extractParams.ts", "../src/xception/extractParamsFromWeightMap.ts", "../src/xception/TinyXception.ts", "../src/ageGenderNet/extractParams.ts", "../src/ageGenderNet/extractParamsFromWeightMap.ts", "../src/ageGenderNet/types.ts", "../src/ageGenderNet/AgeGenderNet.ts", "../src/faceLandmarkNet/FaceLandmark68NetBase.ts", "../src/faceLandmarkNet/FaceLandmark68Net.ts", "../src/faceFeatureExtractor/extractParamsFromWeightMapTiny.ts", "../src/faceFeatureExtractor/extractParamsTiny.ts", "../src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts", "../src/faceLandmarkNet/FaceLandmark68TinyNet.ts", "../src/faceLandmarkNet/index.ts", "../src/faceRecognitionNet/scaleLayer.ts", "../src/faceRecognitionNet/convLayer.ts", "../src/faceRecognitionNet/extractParams.ts", "../src/faceRecognitionNet/extractParamsFromWeightMap.ts", "../src/faceRecognitionNet/residualLayer.ts", "../src/faceRecognitionNet/FaceRecognitionNet.ts", "../src/faceRecognitionNet/index.ts", "../src/factories/WithFaceDescriptor.ts", "../src/factories/WithAge.ts", "../src/factories/WithGender.ts", "../src/ssdMobilenetv1/extractParams.ts", "../src/ssdMobilenetv1/extractParamsFromWeightMap.ts", "../src/ssdMobilenetv1/pointwiseConvLayer.ts", "../src/ssdMobilenetv1/mobileNetV1.ts", "../src/ssdMobilenetv1/nonMaxSuppression.ts", "../src/ssdMobilenetv1/outputLayer.ts", "../src/ssdMobilenetv1/boxPredictionLayer.ts", "../src/ssdMobilenetv1/predictionLayer.ts", "../src/ssdMobilenetv1/SsdMobilenetv1Options.ts", "../src/ssdMobilenetv1/SsdMobilenetv1.ts", "../src/ssdMobilenetv1/index.ts", "../src/tinyYolov2/const.ts", "../src/tinyYolov2/config.ts", "../src/tinyYolov2/leaky.ts", "../src/tinyYolov2/convWithBatchNorm.ts", "../src/tinyYolov2/depthwiseSeparableConv.ts", "../src/tinyYolov2/extractParams.ts", "../src/tinyYolov2/extractParamsFromWeightMap.ts", "../src/tinyYolov2/TinyYolov2Options.ts", "../src/tinyYolov2/TinyYolov2Base.ts", "../src/tinyYolov2/TinyYolov2.ts", "../src/tinyYolov2/index.ts", "../src/tinyFaceDetector/TinyFaceDetectorOptions.ts", "../src/globalApi/ComposableTask.ts", "../src/globalApi/extractFacesAndComputeResults.ts", "../src/tinyFaceDetector/const.ts", "../src/tinyFaceDetector/TinyFaceDetector.ts", "../src/globalApi/nets.ts", "../src/globalApi/PredictFaceExpressionsTask.ts", "../src/globalApi/PredictAgeAndGenderTask.ts", "../src/globalApi/ComputeFaceDescriptorsTasks.ts", "../src/globalApi/DetectFaceLandmarksTasks.ts", "../src/globalApi/DetectFacesTasks.ts", "../src/globalApi/detectFaces.ts", "../src/globalApi/allFaces.ts", "../src/euclideanDistance.ts", "../src/globalApi/FaceMatcher.ts", "../src/tinyFaceDetector/index.ts", "../src/resizeResults.ts", "../src/index.ts"], - "sourcesContent": ["/**\n * Creates tfjs bundle used by Human browser build target\n * @external\n */\n\n// get versions of all packages\nimport { version as tfjsVersion } from '@tensorflow/tfjs/package.json';\nimport { version as tfjsCoreVersion } from '@tensorflow/tfjs-core/package.json';\nimport { version as tfjsDataVersion } from '@tensorflow/tfjs-data/package.json';\nimport { version as tfjsLayersVersion } from '@tensorflow/tfjs-layers/package.json';\nimport { version as tfjsConverterVersion } from '@tensorflow/tfjs-converter/package.json';\nimport { version as tfjsBackendCPUVersion } from '@tensorflow/tfjs-backend-cpu/package.json';\nimport { version as tfjsBackendWebGLVersion } from '@tensorflow/tfjs-backend-webgl/package.json';\nimport { version as tfjsBackendWASMVersion } from '@tensorflow/tfjs-backend-wasm/package.json';\n\n// export all from build\nexport * from '@tensorflow/tfjs-core/dist/index.js';\nexport * from '@tensorflow/tfjs-layers/dist/index.js';\nexport * from '@tensorflow/tfjs-converter/dist/index.js';\nexport * as data from '@tensorflow/tfjs-data/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-webgpu/dist/index.js'; // experimental\n\n// export versions\nexport const version = {\n tfjs: tfjsVersion,\n 'tfjs-core': tfjsCoreVersion,\n 'tfjs-data': tfjsDataVersion,\n 'tfjs-layers': tfjsLayersVersion,\n 'tfjs-converter': tfjsConverterVersion,\n 'tfjs-backend-cpu': tfjsBackendCPUVersion,\n 'tfjs-backend-webgl': tfjsBackendWebGLVersion,\n 'tfjs-backend-wasm': tfjsBackendWASMVersion,\n};\n\n// export * from '@tensorflow/tfjs';\n", "export * from './drawContour';\nexport * from './drawDetections';\nexport * from './drawFaceExpressions';\nexport * from './DrawBox';\nexport * from './DrawFaceLandmarks';\nexport * from './DrawTextField';\n", "import { Point } from '../classes/index';\n\nexport function drawContour(\n ctx: CanvasRenderingContext2D,\n points: Point[],\n isClosed = false,\n) {\n ctx.beginPath();\n\n points.slice(1).forEach(({ x, y }, prevIdx) => {\n const from = points[prevIdx];\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(x, y);\n });\n\n if (isClosed) {\n const from = points[points.length - 1];\n const to = points[0];\n if (!from || !to) {\n return;\n }\n\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n }\n\n ctx.stroke();\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Point } from '../classes/index';\nimport { Dimensions, IDimensions } from '../classes/Dimensions';\n\nexport function isTensor(tensor: any, dim: number) {\n return tensor instanceof tf.Tensor && tensor.shape.length === dim;\n}\n\nexport function isTensor1D(tensor: any): tensor is tf.Tensor1D {\n return isTensor(tensor, 1);\n}\n\nexport function isTensor2D(tensor: any): tensor is tf.Tensor2D {\n return isTensor(tensor, 2);\n}\n\nexport function isTensor3D(tensor: any): tensor is tf.Tensor3D {\n return isTensor(tensor, 3);\n}\n\nexport function isTensor4D(tensor: any): tensor is tf.Tensor4D {\n return isTensor(tensor, 4);\n}\n\nexport function isFloat(num: number) {\n return num % 1 !== 0;\n}\n\nexport function isEven(num: number) {\n return num % 2 === 0;\n}\n\nexport function round(num: number, prec = 2) {\n const f = 10 ** prec;\n return Math.floor(num * f) / f;\n}\n\nexport function isDimensions(obj: any): boolean {\n return obj && obj.width && obj.height;\n}\n\nexport function computeReshapedDimensions({ width, height }: IDimensions, inputSize: number) {\n const scale = inputSize / Math.max(height, width);\n return new Dimensions(Math.round(width * scale), Math.round(height * scale));\n}\n\nexport function getCenterPoint(pts: Point[]): Point {\n return pts.reduce((sum, pt) => sum.add(pt), new Point(0, 0))\n .div(new Point(pts.length, pts.length));\n}\n\nexport function range(num: number, start: number, step: number): number[] {\n return Array(num).fill(0).map((_, i) => start + (i * step));\n}\n\nexport function isValidNumber(num: any) {\n return !!num && (num !== Infinity) && (num !== -Infinity) && !Number.isNaN(num) || num === 0;\n}\n\nexport function isValidProbablitiy(num: any) {\n return isValidNumber(num) && num >= 0 && num <= 1.0;\n}\n", "import { isValidNumber } from '../utils/index';\n\nexport interface IDimensions {\n width: number\n height: number\n}\n\nexport class Dimensions implements IDimensions {\n private _width: number\n\n private _height: number\n\n constructor(width: number, height: number) {\n if (!isValidNumber(width) || !isValidNumber(height)) {\n throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({ width, height })}`);\n }\n\n this._width = width;\n this._height = height;\n }\n\n public get width(): number { return this._width; }\n\n public get height(): number { return this._height; }\n\n public reverse(): Dimensions {\n return new Dimensions(1 / this.width, 1 / this.height);\n }\n}\n", "export interface IPoint {\n x: number\n y: number\n}\n\nexport class Point implements IPoint {\n private _x: number\n\n private _y: number\n\n constructor(x: number, y: number) {\n this._x = x;\n this._y = y;\n }\n\n get x(): number { return this._x; }\n\n get y(): number { return this._y; }\n\n public add(pt: IPoint): Point {\n return new Point(this.x + pt.x, this.y + pt.y);\n }\n\n public sub(pt: IPoint): Point {\n return new Point(this.x - pt.x, this.y - pt.y);\n }\n\n public mul(pt: IPoint): Point {\n return new Point(this.x * pt.x, this.y * pt.y);\n }\n\n public div(pt: IPoint): Point {\n return new Point(this.x / pt.x, this.y / pt.y);\n }\n\n public abs(): Point {\n return new Point(Math.abs(this.x), Math.abs(this.y));\n }\n\n public magnitude(): number {\n return Math.sqrt((this.x ** 2) + (this.y ** 2));\n }\n\n public floor(): Point {\n return new Point(Math.floor(this.x), Math.floor(this.y));\n }\n}\n", "import { isDimensions, isValidNumber } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { IDimensions } from './Dimensions';\nimport { Point } from './Point';\nimport { IRect } from './Rect';\n\nexport class Box implements IBoundingBox, IRect {\n public static isRect(rect: any): boolean {\n return !!rect && [rect.x, rect.y, rect.width, rect.height].every(isValidNumber);\n }\n\n public static assertIsValidBox(box: any, callee: string, allowNegativeDimensions = false) {\n if (!Box.isRect(box)) {\n throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`);\n }\n\n if (!allowNegativeDimensions && (box.width < 0 || box.height < 0)) {\n throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`);\n }\n }\n\n private _x: number\n\n private _y: number\n\n private _width: number\n\n private _height: number\n\n constructor(_box: IBoundingBox | IRect, allowNegativeDimensions = true) {\n const box = (_box || {}) as any;\n\n const isBbox = [box.left, box.top, box.right, box.bottom].every(isValidNumber);\n const isRect = [box.x, box.y, box.width, box.height].every(isValidNumber);\n\n if (!isRect && !isBbox) {\n throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`);\n }\n\n const [x, y, width, height] = isRect\n ? [box.x, box.y, box.width, box.height]\n : [box.left, box.top, box.right - box.left, box.bottom - box.top];\n\n Box.assertIsValidBox({\n x, y, width, height,\n }, 'Box.constructor', allowNegativeDimensions);\n\n this._x = x;\n this._y = y;\n this._width = width;\n this._height = height;\n }\n\n public get x(): number { return this._x; }\n\n public get y(): number { return this._y; }\n\n public get width(): number { return this._width; }\n\n public get height(): number { return this._height; }\n\n public get left(): number { return this.x; }\n\n public get top(): number { return this.y; }\n\n public get right(): number { return this.x + this.width; }\n\n public get bottom(): number { return this.y + this.height; }\n\n public get area(): number { return this.width * this.height; }\n\n public get topLeft(): Point { return new Point(this.left, this.top); }\n\n public get topRight(): Point { return new Point(this.right, this.top); }\n\n public get bottomLeft(): Point { return new Point(this.left, this.bottom); }\n\n public get bottomRight(): Point { return new Point(this.right, this.bottom); }\n\n public round(): Box {\n const [x, y, width, height] = [this.x, this.y, this.width, this.height]\n .map((val) => Math.round(val));\n return new Box({\n x, y, width, height,\n });\n }\n\n public floor(): Box {\n const [x, y, width, height] = [this.x, this.y, this.width, this.height]\n .map((val) => Math.floor(val));\n return new Box({\n x, y, width, height,\n });\n }\n\n public toSquare(): Box {\n let {\n x, y, width, height,\n } = this;\n const diff = Math.abs(width - height);\n if (width < height) {\n x -= (diff / 2);\n width += diff;\n }\n if (height < width) {\n y -= (diff / 2);\n height += diff;\n }\n\n return new Box({ x, y, width, height });\n }\n\n public rescale(s: IDimensions | number): Box {\n const scaleX = isDimensions(s) ? (s as IDimensions).width : s as number;\n const scaleY = isDimensions(s) ? (s as IDimensions).height : s as number;\n return new Box({\n x: this.x * scaleX,\n y: this.y * scaleY,\n width: this.width * scaleX,\n height: this.height * scaleY,\n });\n }\n\n public pad(padX: number, padY: number): Box {\n const [x, y, width, height] = [\n this.x - (padX / 2),\n this.y - (padY / 2),\n this.width + padX,\n this.height + padY,\n ];\n return new Box({\n x, y, width, height,\n });\n }\n\n public clipAtImageBorders(imgWidth: number, imgHeight: number): Box {\n const { x, y, right, bottom } = this;\n const clippedX = Math.max(x, 0);\n const clippedY = Math.max(y, 0);\n\n const newWidth = right - clippedX;\n const newHeight = bottom - clippedY;\n const clippedWidth = Math.min(newWidth, imgWidth - clippedX);\n const clippedHeight = Math.min(newHeight, imgHeight - clippedY);\n\n return (new Box({\n x: clippedX, y: clippedY, width: clippedWidth, height: clippedHeight,\n })).floor();\n }\n\n public shift(sx: number, sy: number): Box {\n const { width, height } = this;\n const x = this.x + sx;\n const y = this.y + sy;\n\n return new Box({\n x, y, width, height,\n });\n }\n\n public padAtBorders(imageHeight: number, imageWidth: number) {\n const w = this.width + 1;\n const h = this.height + 1;\n\n const dx = 1;\n const dy = 1;\n let edx = w;\n let edy = h;\n\n let x = this.left;\n let y = this.top;\n let ex = this.right;\n let ey = this.bottom;\n\n if (ex > imageWidth) {\n edx = -ex + imageWidth + w;\n ex = imageWidth;\n }\n if (ey > imageHeight) {\n edy = -ey + imageHeight + h;\n ey = imageHeight;\n }\n if (x < 1) {\n edy = 2 - x;\n x = 1;\n }\n if (y < 1) {\n edy = 2 - y;\n y = 1;\n }\n\n return {\n dy, edy, dx, edx, y, ey, x, ex, w, h,\n };\n }\n\n public calibrate(region: Box) {\n return new Box({\n left: this.left + (region.left * this.width),\n top: this.top + (region.top * this.height),\n right: this.right + (region.right * this.width),\n bottom: this.bottom + (region.bottom * this.height),\n }).toSquare().round();\n }\n}\n", "import { Box } from './Box';\n\nexport interface IBoundingBox {\n left: number\n top: number\n right: number\n bottom: number\n}\n\nexport class BoundingBox extends Box implements IBoundingBox {\n constructor(left: number, top: number, right: number, bottom: number, allowNegativeDimensions = false) {\n super({\n left, top, right, bottom,\n }, allowNegativeDimensions);\n }\n}\n", "import { Box } from './Box';\nimport { Dimensions, IDimensions } from './Dimensions';\nimport { IRect, Rect } from './Rect';\n\nexport class ObjectDetection {\n private _score: number\n\n private _classScore: number\n\n private _className: string\n\n private _box: Rect\n\n private _imageDims: Dimensions\n\n constructor(\n score: number,\n classScore: number,\n className: string,\n relativeBox: IRect,\n imageDims: IDimensions,\n ) {\n this._imageDims = new Dimensions(imageDims.width, imageDims.height);\n this._score = score;\n this._classScore = classScore;\n this._className = className;\n this._box = new Box(relativeBox).rescale(this._imageDims);\n }\n\n public get score(): number { return this._score; }\n\n public get classScore(): number { return this._classScore; }\n\n public get className(): string { return this._className; }\n\n public get box(): Box { return this._box; }\n\n public get imageDims(): Dimensions { return this._imageDims; }\n\n public get imageWidth(): number { return this.imageDims.width; }\n\n public get imageHeight(): number { return this.imageDims.height; }\n\n public get relativeBox(): Box { return new Box(this._box).rescale(this.imageDims.reverse()); }\n\n public forSize(width: number, height: number): ObjectDetection {\n return new ObjectDetection(\n this.score,\n this.classScore,\n this.className,\n this.relativeBox,\n { width, height },\n );\n }\n}\n", "import { Box } from './Box';\nimport { IDimensions } from './Dimensions';\nimport { ObjectDetection } from './ObjectDetection';\nimport { Rect } from './Rect';\n\nexport interface IFaceDetecion {\n score: number\n box: Box\n}\n\nexport class FaceDetection extends ObjectDetection implements IFaceDetecion {\n constructor(\n score: number,\n relativeBox: Rect,\n imageDims: IDimensions,\n ) {\n super(score, score, '', relativeBox, imageDims);\n }\n\n public override forSize(width: number, height: number): FaceDetection {\n const { score, relativeBox, imageDims } = super.forSize(width, height);\n return new FaceDetection(score, relativeBox, imageDims);\n }\n}\n", "import { Box } from '../classes/Box';\n\nexport function iou(box1: Box, box2: Box, isIOU = true) {\n const width = Math.max(0.0, Math.min(box1.right, box2.right) - Math.max(box1.left, box2.left));\n const height = Math.max(0.0, Math.min(box1.bottom, box2.bottom) - Math.max(box1.top, box2.top));\n const interSection = width * height;\n\n return isIOU\n ? interSection / (box1.area + box2.area - interSection)\n : interSection / Math.min(box1.area, box2.area);\n}\n", "import { BoundingBox, IPoint } from '../classes/index';\n\nexport function minBbox(pts: IPoint[]): BoundingBox {\n const xs = pts.map((pt) => pt.x);\n const ys = pts.map((pt) => pt.y);\n const minX = xs.reduce((min, x) => (x < min ? x : min), Infinity);\n const minY = ys.reduce((min, y) => (y < min ? y : min), Infinity);\n const maxX = xs.reduce((max, x) => (max < x ? x : max), 0);\n const maxY = ys.reduce((max, y) => (max < y ? y : max), 0);\n\n return new BoundingBox(minX, minY, maxX, maxY);\n}\n", "import { Box } from '../classes/Box';\nimport { iou } from './iou';\n\nexport function nonMaxSuppression(\n boxes: Box[],\n scores: number[],\n iouThreshold: number,\n isIOU = true,\n): number[] {\n let indicesSortedByScore = scores\n .map((score, boxIndex) => ({ score, boxIndex }))\n .sort((c1, c2) => c1.score - c2.score)\n .map((c) => c.boxIndex);\n\n const pick: number[] = [];\n\n while (indicesSortedByScore.length > 0) {\n const curr = indicesSortedByScore.pop() as number;\n pick.push(curr);\n\n const indices = indicesSortedByScore;\n\n const outputs: number[] = [];\n for (let i = 0; i < indices.length; i++) {\n const idx = indices[i];\n\n const currBox = boxes[curr];\n const idxBox = boxes[idx];\n\n outputs.push(iou(currBox, idxBox, isIOU));\n }\n\n indicesSortedByScore = indicesSortedByScore.filter(\n (_, j) => outputs[j] <= iouThreshold,\n );\n }\n\n return pick;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function normalize(x: tf.Tensor4D, meanRgb: number[]): tf.Tensor4D {\n return tf.tidy(() => {\n const [r, g, b] = meanRgb;\n const avg_r = tf.fill([...x.shape.slice(0, 3), 1], r, 'float32');\n const avg_g = tf.fill([...x.shape.slice(0, 3), 1], g, 'float32');\n const avg_b = tf.fill([...x.shape.slice(0, 3), 1], b, 'float32');\n const avg_rgb = tf.concat([avg_r, avg_g, avg_b], 3);\n\n return tf.sub(x, avg_rgb);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\n/**\n * Pads the smaller dimension of an image tensor with zeros, such that width === height.\n *\n * @param imgTensor The image tensor.\n * @param isCenterImage (optional, default: false) If true, add an equal amount of padding on\n * both sides of the minor dimension oof the image.\n * @returns The padded tensor with width === height.\n */\nexport function padToSquare(\n imgTensor: tf.Tensor4D,\n isCenterImage = false,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const [height, width] = imgTensor.shape.slice(1);\n if (height === width) {\n return imgTensor;\n }\n\n const dimDiff = Math.abs(height - width);\n const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));\n const paddingAxis = height > width ? 2 : 1;\n\n const createPaddingTensor = (paddingAmountLocal: number): tf.Tensor => {\n const paddingTensorShape = imgTensor.shape.slice();\n paddingTensorShape[paddingAxis] = paddingAmountLocal;\n return tf.fill(paddingTensorShape, 0, 'float32');\n };\n\n const paddingTensorAppend = createPaddingTensor(paddingAmount);\n const remainingPaddingAmount = dimDiff - (paddingTensorAppend.shape[paddingAxis] as number);\n\n const paddingTensorPrepend = isCenterImage && remainingPaddingAmount\n ? createPaddingTensor(remainingPaddingAmount)\n : null;\n\n const tensorsToStack = [\n paddingTensorPrepend,\n imgTensor,\n paddingTensorAppend,\n ]\n .filter((t) => !!t)\n .map((t: tf.Tensor) => tf.cast(t, 'float32')) as tf.Tensor4D[];\n return tf.concat(tensorsToStack, paddingAxis);\n });\n}\n", "export function shuffleArray(inputArray: any[]) {\n const array = inputArray.slice();\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const x = array[i];\n array[i] = array[j];\n array[j] = x;\n }\n return array;\n}\n", "export * from './iou';\nexport * from './minBbox';\nexport * from './nonMaxSuppression';\nexport * from './normalize';\nexport * from './padToSquare';\nexport * from './shuffleArray';\n\nexport function sigmoid(x: number) {\n return 1 / (1 + Math.exp(-x));\n}\n\nexport function inverseSigmoid(x: number) {\n return Math.log(x / (1 - x));\n}\n", "import { Box } from './Box';\n\nexport interface IRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport class Rect extends Box implements IRect {\n constructor(x: number, y: number, width: number, height: number, allowNegativeDimensions = false) {\n super({\n x, y, width, height,\n }, allowNegativeDimensions);\n }\n}\n", "import { minBbox } from '../ops/index';\nimport { getCenterPoint } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { Box } from './Box';\nimport { Dimensions, IDimensions } from './Dimensions';\nimport { FaceDetection } from './FaceDetection';\nimport { Point } from './Point';\nimport { IRect, Rect } from './Rect';\n\n// face alignment constants\nconst relX = 0.5;\nconst relY = 0.43;\nconst relScale = 0.45;\n\nexport interface IFaceLandmarks {\n positions: Point[]\n shift: Point\n}\n\nexport class FaceLandmarks implements IFaceLandmarks {\n protected _shift: Point\n\n protected _positions: Point[]\n\n protected _imgDims: Dimensions\n\n constructor(\n relativeFaceLandmarkPositions: Point[],\n imgDims: IDimensions,\n shift: Point = new Point(0, 0),\n ) {\n const { width, height } = imgDims;\n this._imgDims = new Dimensions(width, height);\n this._shift = shift;\n this._positions = relativeFaceLandmarkPositions.map(\n (pt) => pt.mul(new Point(width, height)).add(shift),\n );\n }\n\n public get shift(): Point { return new Point(this._shift.x, this._shift.y); }\n\n public get imageWidth(): number { return this._imgDims.width; }\n\n public get imageHeight(): number { return this._imgDims.height; }\n\n public get positions(): Point[] { return this._positions; }\n\n public get relativePositions(): Point[] {\n return this._positions.map(\n (pt) => pt.sub(this._shift).div(new Point(this.imageWidth, this.imageHeight)),\n );\n }\n\n public forSize(width: number, height: number): T {\n return new (this.constructor as any)(\n this.relativePositions,\n { width, height },\n );\n }\n\n public shiftBy(x: number, y: number): T {\n return new (this.constructor as any)(\n this.relativePositions,\n this._imgDims,\n new Point(x, y),\n );\n }\n\n public shiftByPoint(pt: Point): T {\n return this.shiftBy(pt.x, pt.y);\n }\n\n /**\n * Aligns the face landmarks after face detection from the relative positions of the faces\n * bounding box, or it's current shift. This function should be used to align the face images\n * after face detection has been performed, before they are passed to the face recognition net.\n * This will make the computed face descriptor more accurate.\n *\n * @param detection (optional) The bounding box of the face or the face detection result. If\n * no argument was passed the position of the face landmarks are assumed to be relative to\n * it's current shift.\n * @returns The bounding box of the aligned face.\n */\n public align(\n detection?: FaceDetection | IRect | IBoundingBox | null,\n options: { useDlibAlignment?: boolean, minBoxPadding?: number } = { },\n ): Box {\n if (detection) {\n const box = detection instanceof FaceDetection\n ? detection.box.floor()\n : new Box(detection);\n\n return this.shiftBy(box.x, box.y).align(null, options);\n }\n\n const { useDlibAlignment, minBoxPadding } = { useDlibAlignment: false, minBoxPadding: 0.2, ...options };\n\n if (useDlibAlignment) {\n return this.alignDlib();\n }\n\n return this.alignMinBbox(minBoxPadding);\n }\n\n private alignDlib(): Box {\n const centers = this.getRefPointsForAlignment();\n\n const [leftEyeCenter, rightEyeCenter, mouthCenter] = centers;\n const distToMouth = (pt: Point) => mouthCenter.sub(pt).magnitude();\n const eyeToMouthDist = (distToMouth(leftEyeCenter) + distToMouth(rightEyeCenter)) / 2;\n\n const size = Math.floor(eyeToMouthDist / relScale);\n\n const refPoint = getCenterPoint(centers);\n // TODO: pad in case rectangle is out of image bounds\n const x = Math.floor(Math.max(0, refPoint.x - (relX * size)));\n const y = Math.floor(Math.max(0, refPoint.y - (relY * size)));\n\n return new Rect(x, y, Math.min(size, this.imageWidth + x), Math.min(size, this.imageHeight + y));\n }\n\n private alignMinBbox(padding: number): Box {\n const box = minBbox(this.positions);\n return box.pad(box.width * padding, box.height * padding);\n }\n\n protected getRefPointsForAlignment(): Point[] {\n throw new Error('getRefPointsForAlignment not implemented by base class');\n }\n}\n", "import { getCenterPoint } from '../utils/index';\nimport { FaceLandmarks } from './FaceLandmarks';\nimport { Point } from './Point';\n\nexport class FaceLandmarks5 extends FaceLandmarks {\n protected override getRefPointsForAlignment(): Point[] {\n const pts = this.positions;\n return [\n pts[0],\n pts[1],\n getCenterPoint([pts[3], pts[4]]),\n ];\n }\n}\n", "import { getCenterPoint } from '../utils/index';\nimport { FaceLandmarks } from './FaceLandmarks';\nimport { Point } from './Point';\n\nexport class FaceLandmarks68 extends FaceLandmarks {\n public getJawOutline(): Point[] {\n return this.positions.slice(0, 17);\n }\n\n public getLeftEyeBrow(): Point[] {\n return this.positions.slice(17, 22);\n }\n\n public getRightEyeBrow(): Point[] {\n return this.positions.slice(22, 27);\n }\n\n public getNose(): Point[] {\n return this.positions.slice(27, 36);\n }\n\n public getLeftEye(): Point[] {\n return this.positions.slice(36, 42);\n }\n\n public getRightEye(): Point[] {\n return this.positions.slice(42, 48);\n }\n\n public getMouth(): Point[] {\n return this.positions.slice(48, 68);\n }\n\n protected override getRefPointsForAlignment(): Point[] {\n return [\n this.getLeftEye(),\n this.getRightEye(),\n this.getMouth(),\n ].map(getCenterPoint);\n }\n}\n", "import { round } from '../utils/index';\n\nexport interface IFaceMatch {\n label: string\n distance: number\n}\n\nexport class FaceMatch implements IFaceMatch {\n private _label: string\n\n private _distance: number\n\n constructor(label: string, distance: number) {\n this._label = label;\n this._distance = distance;\n }\n\n public get label(): string { return this._label; }\n\n public get distance(): number { return this._distance; }\n\n public toString(withDistance = true): string {\n return `${this.label}${withDistance ? ` (${round(this.distance)})` : ''}`;\n }\n}\n", "import { isValidNumber } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { Box } from './Box';\nimport { IRect } from './Rect';\n\nexport class LabeledBox extends Box {\n public static assertIsValidLabeledBox(box: any, callee: string) {\n Box.assertIsValidBox(box, callee);\n\n if (!isValidNumber(box.label)) {\n throw new Error(`${callee} - expected property label (${box.label}) to be a number`);\n }\n }\n\n private _label: number\n\n constructor(box: IBoundingBox | IRect | any, label: number) {\n super(box);\n this._label = label;\n }\n\n public get label(): number { return this._label; }\n}\n", "export class LabeledFaceDescriptors {\n private _label: string\n\n private _descriptors: Float32Array[]\n\n constructor(label: string, descriptors: Float32Array[]) {\n if (!(typeof label === 'string')) {\n throw new Error('LabeledFaceDescriptors - constructor expected label to be a string');\n }\n\n if (!Array.isArray(descriptors) || descriptors.some((desc) => !(desc instanceof Float32Array))) {\n throw new Error('LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array');\n }\n\n this._label = label;\n this._descriptors = descriptors;\n }\n\n public get label(): string { return this._label; }\n\n public get descriptors(): Float32Array[] { return this._descriptors; }\n\n public toJSON(): any {\n return {\n label: this.label,\n descriptors: this.descriptors.map((d) => Array.from(d)),\n };\n }\n\n public static fromJSON(json: any): LabeledFaceDescriptors {\n const descriptors = json.descriptors.map((d: any) => new Float32Array(d));\n return new LabeledFaceDescriptors(json.label, descriptors);\n }\n}\n", "import { isValidProbablitiy } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { LabeledBox } from './LabeledBox';\nimport { IRect } from './Rect';\n\nexport class PredictedBox extends LabeledBox {\n public static assertIsValidPredictedBox(box: any, callee: string) {\n LabeledBox.assertIsValidLabeledBox(box, callee);\n\n if (\n !isValidProbablitiy(box.score)\n || !isValidProbablitiy(box.classScore)\n ) {\n throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`);\n }\n }\n\n private _score: number\n\n private _classScore: number\n\n constructor(box: IBoundingBox | IRect | any, label: number, score: number, classScore: number) {\n super(box, label);\n this._score = score;\n this._classScore = classScore;\n }\n\n public get score(): number { return this._score; }\n\n public get classScore(): number { return this._classScore; }\n}\n", "import { FaceDetection } from '../classes/FaceDetection';\n\nexport type WithFaceDetection = TSource & {\n detection: FaceDetection\n}\n\nexport function isWithFaceDetection(obj: any): obj is WithFaceDetection<{}> {\n return obj.detection instanceof FaceDetection;\n}\n\nexport function extendWithFaceDetection(sourceObj: TSource, detection: FaceDetection): WithFaceDetection {\n const extension = { detection };\n return { ...sourceObj, ...extension };\n}\n", "import { Environment } from './types';\n\nexport function createBrowserEnv(): Environment {\n const fetch = window.fetch;\n if (!fetch) throw new Error('fetch - missing fetch implementation for browser environment');\n\n const readFile = () => {\n throw new Error('readFile - filesystem not available for browser environment');\n };\n\n return {\n Canvas: HTMLCanvasElement,\n CanvasRenderingContext2D,\n Image: HTMLImageElement,\n ImageData,\n Video: HTMLVideoElement,\n createCanvasElement: () => document.createElement('canvas'),\n createImageElement: () => document.createElement('img'),\n createVideoElement: () => document.createElement('video'),\n fetch,\n readFile,\n };\n}\n", "import { FileSystem } from './types';\n\nexport function createFileSystem(fs?: any): FileSystem {\n let requireFsError = '';\n\n if (!fs) {\n try {\n // eslint-disable-next-line global-require\n fs = require('fs');\n } catch (err) {\n requireFsError = err.toString();\n }\n }\n\n const readFile = fs\n ? (filePath: string) => new Promise((resolve, reject) => {\n fs.readFile(filePath, (err: any, buffer: Buffer) => (err ? reject(err) : resolve(buffer)));\n })\n : () => {\n throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`);\n };\n\n return {\n readFile,\n };\n}\n", "/* eslint-disable max-classes-per-file */\nimport { createFileSystem } from './createFileSystem';\nimport { Environment } from './types';\n\nexport function createNodejsEnv(): Environment {\n // eslint-disable-next-line dot-notation\n const Canvas = global['Canvas'] || global.HTMLCanvasElement;\n const Image = global.Image || global.HTMLImageElement;\n // eslint-disable-next-line dot-notation\n const Video = global['Video'] || global.HTMLVideoElement;\n\n const createCanvasElement = () => {\n if (Canvas) return new Canvas();\n throw new Error('createCanvasElement - missing Canvas implementation for nodejs environment');\n };\n\n const createImageElement = () => {\n if (Image) return new Image();\n throw new Error('createImageElement - missing Image implementation for nodejs environment');\n };\n\n const createVideoElement = () => {\n if (Video) return new Video();\n throw new Error('createVideoElement - missing Video implementation for nodejs environment');\n };\n\n const fetch = global.fetch;\n // if (!fetch) throw new Error('fetch - missing fetch implementation for nodejs environment');\n\n const fileSystem = createFileSystem();\n\n return {\n Canvas: Canvas || class {},\n CanvasRenderingContext2D: global.CanvasRenderingContext2D || class {},\n Image: Image || class {},\n ImageData: global.ImageData || class {},\n Video: global.HTMLVideoElement || class {},\n createCanvasElement,\n createImageElement,\n createVideoElement,\n fetch,\n ...fileSystem,\n };\n}\n", "export function isBrowser(): boolean {\n return typeof window === 'object'\n && typeof document !== 'undefined'\n && typeof HTMLImageElement !== 'undefined'\n && typeof HTMLCanvasElement !== 'undefined'\n && typeof HTMLVideoElement !== 'undefined'\n && typeof ImageData !== 'undefined'\n && typeof CanvasRenderingContext2D !== 'undefined';\n}\n", "export function isNodejs(): boolean {\n return typeof global === 'object'\n && typeof require === 'function'\n && typeof module !== 'undefined'\n && typeof process !== 'undefined' && !!process.version;\n}\n", "import { createBrowserEnv } from './createBrowserEnv';\nimport { createFileSystem } from './createFileSystem';\nimport { createNodejsEnv } from './createNodejsEnv';\nimport { isBrowser } from './isBrowser';\nimport { isNodejs } from './isNodejs';\nimport { Environment } from './types';\n\nlet environment: Environment | null;\n\nfunction getEnv(): Environment {\n if (!environment) {\n throw new Error('getEnv - environment is not defined, check isNodejs() and isBrowser()');\n }\n return environment;\n}\n\nfunction setEnv(env: Environment) {\n environment = env;\n}\n\nfunction initialize() {\n // check for isBrowser() first to prevent electron renderer process\n // to be initialized with wrong environment due to isNodejs() returning true\n if (isBrowser()) return setEnv(createBrowserEnv());\n if (isNodejs()) return setEnv(createNodejsEnv());\n return null;\n}\n\nfunction monkeyPatch(env: Partial) {\n if (!environment) {\n initialize();\n }\n\n if (!environment) {\n throw new Error('monkeyPatch - environment is not defined, check isNodejs() and isBrowser()');\n }\n\n const { Canvas = environment.Canvas, Image = environment.Image } = env;\n environment.Canvas = Canvas;\n environment.Image = Image;\n environment.createCanvasElement = env.createCanvasElement || (() => new Canvas());\n environment.createImageElement = env.createImageElement || (() => new Image());\n\n environment.ImageData = env.ImageData || environment.ImageData;\n environment.Video = env.Video || environment.Video;\n environment.fetch = env.fetch || environment.fetch;\n environment.readFile = env.readFile || environment.readFile;\n}\n\nexport const env = {\n getEnv,\n setEnv,\n initialize,\n createBrowserEnv,\n createFileSystem,\n createNodejsEnv,\n monkeyPatch,\n isBrowser,\n isNodejs,\n};\n\ninitialize();\n\nexport * from './types';\n", "import { env } from '../env/index';\n\nexport function resolveInput(arg: string | any) {\n if (!env.isNodejs() && typeof arg === 'string') {\n return document.getElementById(arg);\n }\n return arg;\n}\n", "import { env } from '../env/index';\nimport { resolveInput } from './resolveInput';\n\nexport function getContext2dOrThrow(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D): CanvasRenderingContext2D {\n const { Canvas, CanvasRenderingContext2D } = env.getEnv();\n\n if (canvasArg instanceof CanvasRenderingContext2D) {\n return canvasArg;\n }\n\n const canvas = resolveInput(canvasArg);\n\n if (!(canvas instanceof Canvas)) {\n throw new Error('resolveContext2d - expected canvas to be of instance of Canvas');\n }\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('resolveContext2d - canvas 2d context is null');\n }\n\n return ctx;\n}\n", "/* eslint-disable max-classes-per-file */\nimport { IDimensions, IPoint } from '../classes/index';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { resolveInput } from '../dom/resolveInput';\n\n// eslint-disable-next-line no-shadow\nexport enum AnchorPosition {\n // eslint-disable-next-line no-unused-vars\n TOP_LEFT = 'TOP_LEFT',\n // eslint-disable-next-line no-unused-vars\n TOP_RIGHT = 'TOP_RIGHT',\n // eslint-disable-next-line no-unused-vars\n BOTTOM_LEFT = 'BOTTOM_LEFT',\n // eslint-disable-next-line no-unused-vars\n BOTTOM_RIGHT = 'BOTTOM_RIGHT'\n}\n\nexport interface IDrawTextFieldOptions {\n anchorPosition?: AnchorPosition\n backgroundColor?: string\n fontColor?: string\n fontSize?: number\n fontStyle?: string\n padding?: number\n}\n\nexport class DrawTextFieldOptions implements IDrawTextFieldOptions {\n public anchorPosition: AnchorPosition\n\n public backgroundColor: string\n\n public fontColor: string\n\n public fontSize: number\n\n public fontStyle: string\n\n public padding: number\n\n constructor(options: IDrawTextFieldOptions = {}) {\n const {\n anchorPosition, backgroundColor, fontColor, fontSize, fontStyle, padding,\n } = options;\n this.anchorPosition = anchorPosition || AnchorPosition.TOP_LEFT;\n this.backgroundColor = backgroundColor || 'rgba(0, 0, 0, 0.5)';\n this.fontColor = fontColor || 'rgba(255, 255, 255, 1)';\n this.fontSize = fontSize || 14;\n this.fontStyle = fontStyle || 'Georgia';\n this.padding = padding || 4;\n }\n}\n\nexport class DrawTextField {\n public text: string[]\n\n public anchor : IPoint\n\n public options: DrawTextFieldOptions\n\n constructor(\n text: string | string[] | DrawTextField,\n anchor: IPoint,\n options: IDrawTextFieldOptions = {},\n ) {\n // eslint-disable-next-line no-nested-ternary\n this.text = typeof text === 'string'\n ? [text]\n : (text instanceof DrawTextField ? text.text : text);\n this.anchor = anchor;\n this.options = new DrawTextFieldOptions(options);\n }\n\n measureWidth(ctx: CanvasRenderingContext2D): number {\n const { padding } = this.options;\n return this.text.map((l) => ctx.measureText(l).width).reduce((w0, w1) => (w0 < w1 ? w1 : w0), 0) + (2 * padding);\n }\n\n measureHeight(): number {\n const { fontSize, padding } = this.options;\n return this.text.length * fontSize + (2 * padding);\n }\n\n getUpperLeft(ctx: CanvasRenderingContext2D, canvasDims?: IDimensions): IPoint {\n const { anchorPosition } = this.options;\n const isShiftLeft = anchorPosition === AnchorPosition.BOTTOM_RIGHT || anchorPosition === AnchorPosition.TOP_RIGHT;\n const isShiftTop = anchorPosition === AnchorPosition.BOTTOM_LEFT || anchorPosition === AnchorPosition.BOTTOM_RIGHT;\n\n const textFieldWidth = this.measureWidth(ctx);\n const textFieldHeight = this.measureHeight();\n const x = (isShiftLeft ? this.anchor.x - textFieldWidth : this.anchor.x);\n const y = isShiftTop ? this.anchor.y - textFieldHeight : this.anchor.y;\n\n // adjust anchor if text box exceeds canvas borders\n if (canvasDims) {\n const { width, height } = canvasDims;\n const newX = Math.max(Math.min(x, width - textFieldWidth), 0);\n const newY = Math.max(Math.min(y, height - textFieldHeight), 0);\n return { x: newX, y: newY };\n }\n return { x, y };\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const canvas = resolveInput(canvasArg);\n const ctx = getContext2dOrThrow(canvas);\n\n const {\n backgroundColor, fontColor, fontSize, fontStyle, padding,\n } = this.options;\n\n ctx.font = `${fontSize}px ${fontStyle}`;\n const maxTextWidth = this.measureWidth(ctx);\n const textHeight = this.measureHeight();\n\n ctx.fillStyle = backgroundColor;\n const upperLeft = this.getUpperLeft(ctx, canvas);\n ctx.fillRect(upperLeft.x, upperLeft.y, maxTextWidth, textHeight);\n\n ctx.fillStyle = fontColor;\n this.text.forEach((textLine, i) => {\n const x = padding + upperLeft.x;\n const y = padding + upperLeft.y + ((i + 1) * fontSize);\n ctx.fillText(textLine, x, y);\n });\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { Box, IBoundingBox, IRect } from '../classes/index';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { AnchorPosition, DrawTextField, DrawTextFieldOptions, IDrawTextFieldOptions } from './DrawTextField';\n\nexport interface IDrawBoxOptions {\n boxColor?: string\n lineWidth?: number\n drawLabelOptions?: IDrawTextFieldOptions\n label?: string\n}\n\nexport class DrawBoxOptions {\n public boxColor: string\n\n public lineWidth: number\n\n public drawLabelOptions: DrawTextFieldOptions\n\n public label?: string\n\n constructor(options: IDrawBoxOptions = {}) {\n const {\n boxColor, lineWidth, label, drawLabelOptions,\n } = options;\n this.boxColor = boxColor || 'rgba(0, 0, 255, 1)';\n this.lineWidth = lineWidth || 2;\n this.label = label;\n\n const defaultDrawLabelOptions = {\n anchorPosition: AnchorPosition.BOTTOM_LEFT,\n backgroundColor: this.boxColor,\n };\n this.drawLabelOptions = new DrawTextFieldOptions({ ...defaultDrawLabelOptions, ...drawLabelOptions });\n }\n}\n\nexport class DrawBox {\n public box: Box\n\n public options: DrawBoxOptions\n\n constructor(\n box: IBoundingBox | IRect,\n options: IDrawBoxOptions = {},\n ) {\n this.box = new Box(box);\n this.options = new DrawBoxOptions(options);\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const ctx = getContext2dOrThrow(canvasArg);\n\n const { boxColor, lineWidth } = this.options;\n\n const {\n x, y, width, height,\n } = this.box;\n ctx.strokeStyle = boxColor;\n ctx.lineWidth = lineWidth;\n ctx.strokeRect(x, y, width, height);\n\n const { label } = this.options;\n if (label) {\n new DrawTextField([label], { x: x - (lineWidth / 2), y }, this.options.drawLabelOptions).draw(canvasArg);\n }\n }\n}\n", "import { Box, IBoundingBox, IRect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { round } from '../utils/index';\nimport { DrawBox } from './DrawBox';\n\nexport type TDrawDetectionsInput = IRect | IBoundingBox | FaceDetection | WithFaceDetection<{}>\n\nexport function drawDetections(\n canvasArg: string | HTMLCanvasElement,\n detections: TDrawDetectionsInput | Array,\n) {\n const detectionsArray = Array.isArray(detections) ? detections : [detections];\n\n detectionsArray.forEach((det) => {\n // eslint-disable-next-line no-nested-ternary\n const score = det instanceof FaceDetection\n ? det.score\n : (isWithFaceDetection(det) ? det.detection.score : undefined);\n\n // eslint-disable-next-line no-nested-ternary\n const box = det instanceof FaceDetection\n ? det.box\n : (isWithFaceDetection(det) ? det.detection.box : new Box(det));\n\n const label = score ? `${round(score)}` : undefined;\n new DrawBox(box, { label }).draw(canvasArg);\n });\n}\n", "import { env } from '../env/index';\n\nexport function isMediaLoaded(media: HTMLImageElement | HTMLVideoElement) : boolean {\n const { Image, Video } = env.getEnv();\n\n return (media instanceof Image && media.complete)\n || (media instanceof Video && media.readyState >= 3);\n}\n", "import { env } from '../env/index';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function awaitMediaLoaded(media: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement) {\n // eslint-disable-next-line consistent-return\n return new Promise((resolve, reject) => {\n if (media instanceof env.getEnv().Canvas || isMediaLoaded(media)) return resolve(null);\n\n function onError(e: Event) {\n if (!e.currentTarget) return;\n // eslint-disable-next-line no-use-before-define\n e.currentTarget.removeEventListener('load', onLoad);\n e.currentTarget.removeEventListener('error', onError);\n reject(e);\n }\n\n function onLoad(e: Event) {\n if (!e.currentTarget) return;\n e.currentTarget.removeEventListener('load', onLoad);\n e.currentTarget.removeEventListener('error', onError);\n resolve(e);\n }\n\n media.addEventListener('load', onLoad);\n media.addEventListener('error', onError);\n });\n}\n", "import { env } from '../env/index';\n\nexport function bufferToImage(buf: Blob): Promise {\n return new Promise((resolve, reject) => {\n if (!(buf instanceof Blob)) reject(new Error('bufferToImage - expected buf to be of type: Blob'));\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') reject(new Error('bufferToImage - expected reader.result to be a string, in onload'));\n const img = env.getEnv().createImageElement();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = reader.result as string;\n };\n reader.onerror = reject;\n reader.readAsDataURL(buf);\n });\n}\n", "import { Dimensions, IDimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\n\nexport function getMediaDimensions(input: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | IDimensions): Dimensions {\n const { Image, Video } = env.getEnv();\n\n if (input instanceof Image) {\n return new Dimensions(input.naturalWidth, input.naturalHeight);\n }\n if (input instanceof Video) {\n return new Dimensions(input.videoWidth, input.videoHeight);\n }\n return new Dimensions(input.width, input.height);\n}\n", "import { IDimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { getMediaDimensions } from './getMediaDimensions';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function createCanvas({ width, height }: IDimensions): HTMLCanvasElement {\n const { createCanvasElement } = env.getEnv();\n const canvas = createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n\nexport function createCanvasFromMedia(media: HTMLImageElement | HTMLVideoElement | ImageData, dims?: IDimensions): HTMLCanvasElement {\n const { ImageData } = env.getEnv();\n\n if (!(media instanceof ImageData) && !isMediaLoaded(media)) {\n throw new Error('createCanvasFromMedia - media has not finished loading yet');\n }\n\n const { width, height } = dims || getMediaDimensions(media);\n const canvas = createCanvas({ width, height });\n\n if (media instanceof ImageData) {\n getContext2dOrThrow(canvas).putImageData(media, 0, 0);\n } else {\n getContext2dOrThrow(canvas).drawImage(media, 0, 0, width, height);\n }\n return canvas;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { env } from '../env/index';\nimport { isTensor4D } from '../utils/index';\n\nexport async function imageTensorToCanvas(\n imgTensor: tf.Tensor,\n canvas?: HTMLCanvasElement,\n): Promise {\n const targetCanvas = canvas || env.getEnv().createCanvasElement();\n\n const [height, width, numChannels] = imgTensor.shape.slice(isTensor4D(imgTensor) ? 1 : 0);\n const imgTensor3D = tf.tidy(() => imgTensor.as3D(height, width, numChannels).toInt());\n await tf.browser.toPixels(imgTensor3D, targetCanvas);\n\n imgTensor3D.dispose();\n\n return targetCanvas;\n}\n", "import { env } from '../env/index';\n\nexport function isMediaElement(input: any) {\n const { Image, Canvas, Video } = env.getEnv();\n\n return input instanceof Image\n || input instanceof Canvas\n || input instanceof Video;\n}\n", "import { env } from '../env/index';\nimport { createCanvas, createCanvasFromMedia } from './createCanvas';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { getMediaDimensions } from './getMediaDimensions';\n\nexport function imageToSquare(input: HTMLImageElement | HTMLCanvasElement, inputSize: number, centerImage = false) {\n const { Image, Canvas } = env.getEnv();\n\n if (!(input instanceof Image || input instanceof Canvas)) {\n throw new Error('imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement');\n }\n\n if (inputSize <= 0) return createCanvas({ width: 1, height: 1 });\n const dims = getMediaDimensions(input);\n const scale = inputSize / Math.max(dims.height, dims.width);\n const width = scale * dims.width;\n const height = scale * dims.height;\n\n const targetCanvas = createCanvas({ width: inputSize, height: inputSize });\n const inputCanvas = input instanceof Canvas ? input : createCanvasFromMedia(input);\n\n const offset = Math.abs(width - height) / 2;\n const dx = centerImage && width < height ? offset : 0;\n const dy = centerImage && height < width ? offset : 0;\n if (inputCanvas.width > 0 && inputCanvas.height > 0) getContext2dOrThrow(targetCanvas).drawImage(inputCanvas, dx, dy, width, height);\n\n return targetCanvas;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Dimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\nimport { padToSquare } from '../ops/padToSquare';\nimport { computeReshapedDimensions, isTensor3D, isTensor4D, range } from '../utils/index';\nimport { createCanvasFromMedia } from './createCanvas';\nimport { imageToSquare } from './imageToSquare';\nimport { TResolvedNetInput } from './types';\n\nexport class NetInput {\n private _imageTensors: Array = []\n\n private _canvases: HTMLCanvasElement[] = []\n\n private _batchSize: number\n\n private _treatAsBatchInput = false\n\n private _inputDimensions: number[][] = []\n\n private _inputSize = 0\n\n constructor(inputs: Array, treatAsBatchInput = false) {\n if (!Array.isArray(inputs)) {\n throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${inputs}`);\n }\n\n this._treatAsBatchInput = treatAsBatchInput;\n this._batchSize = inputs.length;\n\n inputs.forEach((input, idx) => {\n if (isTensor3D(input)) {\n this._imageTensors[idx] = input;\n this._inputDimensions[idx] = input.shape;\n return;\n }\n\n if (isTensor4D(input)) {\n const batchSize = (input as any).shape[0];\n if (batchSize !== 1) {\n throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);\n }\n\n this._imageTensors[idx] = input;\n this._inputDimensions[idx] = (input as any).shape.slice(1);\n return;\n }\n\n const canvas = (input as any) instanceof env.getEnv().Canvas ? input : createCanvasFromMedia(input);\n this._canvases[idx] = canvas;\n this._inputDimensions[idx] = [canvas.height, canvas.width, 3];\n });\n }\n\n public get imageTensors(): Array {\n return this._imageTensors;\n }\n\n public get canvases(): HTMLCanvasElement[] {\n return this._canvases;\n }\n\n public get isBatchInput(): boolean {\n return this.batchSize > 1 || this._treatAsBatchInput;\n }\n\n public get batchSize(): number {\n return this._batchSize;\n }\n\n public get inputDimensions(): number[][] {\n return this._inputDimensions;\n }\n\n public get inputSize(): number | undefined {\n return this._inputSize;\n }\n\n public get reshapedInputDimensions(): Dimensions[] {\n return range(this.batchSize, 0, 1).map(\n (_, batchIdx) => this.getReshapedInputDimensions(batchIdx),\n );\n }\n\n public getInput(batchIdx: number): tf.Tensor3D | tf.Tensor4D | HTMLCanvasElement {\n return this.canvases[batchIdx] || this.imageTensors[batchIdx];\n }\n\n public getInputDimensions(batchIdx: number): number[] {\n return this._inputDimensions[batchIdx];\n }\n\n public getInputHeight(batchIdx: number): number {\n return this._inputDimensions[batchIdx][0];\n }\n\n public getInputWidth(batchIdx: number): number {\n return this._inputDimensions[batchIdx][1];\n }\n\n public getReshapedInputDimensions(batchIdx: number): Dimensions {\n if (typeof this.inputSize !== 'number') {\n throw new Error('getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet');\n }\n\n const width = this.getInputWidth(batchIdx);\n const height = this.getInputHeight(batchIdx);\n return computeReshapedDimensions({ width, height }, this.inputSize);\n }\n\n /**\n * Create a batch tensor from all input canvases and tensors\n * with size [batchSize, inputSize, inputSize, 3].\n *\n * @param inputSize Height and width of the tensor.\n * @param isCenterImage (optional, default: false) If true, add an equal amount of padding on\n * both sides of the minor dimension oof the image.\n * @returns The batch tensor.\n */\n public toBatchTensor(inputSize: number, isCenterInputs = true): tf.Tensor4D {\n this._inputSize = inputSize;\n\n return tf.tidy(() => {\n const inputTensors = range(this.batchSize, 0, 1).map((batchIdx) => {\n const input = this.getInput(batchIdx);\n\n if (input instanceof tf.Tensor) {\n let imgTensor = isTensor4D(input) ? input : tf.expandDims(input);\n imgTensor = padToSquare(imgTensor, isCenterInputs);\n\n if (imgTensor.shape[1] !== inputSize || imgTensor.shape[2] !== inputSize) {\n imgTensor = tf.image.resizeBilinear(imgTensor, [inputSize, inputSize], false, false);\n }\n\n return imgTensor.as3D(inputSize, inputSize, 3);\n }\n\n if (input instanceof env.getEnv().Canvas) {\n return tf.browser.fromPixels(imageToSquare(input, inputSize, isCenterInputs));\n }\n\n throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`);\n });\n\n const batchTensor = tf.stack(inputTensors.map((t) => tf.cast(t, 'float32'))).as4D(this.batchSize, inputSize, inputSize, 3);\n\n return batchTensor;\n });\n }\n}\n", "import { isTensor3D, isTensor4D } from '../utils/index';\nimport { awaitMediaLoaded } from './awaitMediaLoaded';\nimport { isMediaElement } from './isMediaElement';\nimport { NetInput } from './NetInput';\nimport { resolveInput } from './resolveInput';\nimport { TNetInput } from './types';\n\n/**\n * Validates the input to make sure, they are valid net inputs and awaits all media elements\n * to be finished loading.\n *\n * @param input The input, which can be a media element or an array of different media elements.\n * @returns A NetInput instance, which can be passed into one of the neural networks.\n */\nexport async function toNetInput(inputs: TNetInput): Promise {\n if (inputs instanceof NetInput) return inputs;\n const inputArgArray = Array.isArray(inputs) ? inputs : [inputs];\n if (!inputArgArray.length) throw new Error('toNetInput - empty array passed as input');\n const getIdxHint = (idx: number) => (Array.isArray(inputs) ? ` at input index ${idx}:` : '');\n const inputArray = inputArgArray.map(resolveInput);\n inputArray.forEach((input, i) => {\n if (!isMediaElement(input) && !isTensor3D(input) && !isTensor4D(input)) {\n if (typeof inputArgArray[i] === 'string') throw new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`);\n throw new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);\n }\n if (isTensor4D(input)) {\n // if tf.Tensor4D is passed in the input array, the batch size has to be 1\n const batchSize = input.shape[0];\n if (batchSize !== 1) throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);\n }\n });\n // wait for all media elements being loaded\n await Promise.all(inputArray.map((input) => isMediaElement(input) && awaitMediaLoaded(input)));\n return new NetInput(inputArray, Array.isArray(inputs));\n}\n", "import { FaceDetection } from '../classes/FaceDetection';\nimport { Rect } from '../classes/Rect';\nimport { env } from '../env/index';\nimport { createCanvas } from './createCanvas';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { imageTensorToCanvas } from './imageTensorToCanvas';\nimport { toNetInput } from './toNetInput';\nimport { TNetInput } from './types';\n\n/**\n * Extracts the image regions containing the detected faces.\n *\n * @param input The image that face detection has been performed on.\n * @param detections The face detection results or face bounding boxes for that image.\n * @returns The Canvases of the corresponding image region for each detected face.\n */\nexport async function extractFaces(input: TNetInput, detections: Array): Promise {\n const { Canvas } = env.getEnv();\n let canvas = input as HTMLCanvasElement;\n if (!(input instanceof Canvas)) {\n const netInput = await toNetInput(input);\n if (netInput.batchSize > 1) throw new Error('extractFaces - batchSize > 1 not supported');\n const tensorOrCanvas = netInput.getInput(0);\n canvas = tensorOrCanvas instanceof Canvas ? tensorOrCanvas : await imageTensorToCanvas(tensorOrCanvas);\n }\n const ctx = getContext2dOrThrow(canvas);\n const boxes = detections\n .map((det) => (det instanceof FaceDetection ? det.forSize(canvas.width, canvas.height).box.floor() : det))\n .map((box) => box.clipAtImageBorders(canvas.width, canvas.height));\n return boxes.map(({ x, y, width, height }) => {\n const faceImg = createCanvas({ width, height });\n if (width > 0 && height > 0) getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x, y, width, height), 0, 0);\n return faceImg;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Rect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isTensor3D, isTensor4D } from '../utils/index';\n\n/**\n * Extracts the tensors of the image regions containing the detected faces.\n * Useful if you want to compute the face descriptors for the face images.\n * Using this method is faster then extracting a canvas for each face and\n * converting them to tensors individually.\n *\n * @param imageTensor The image tensor that face detection has been performed on.\n * @param detections The face detection results or face bounding boxes for that image.\n * @returns Tensors of the corresponding image region for each detected face.\n */\nexport async function extractFaceTensors(imageTensor: tf.Tensor3D | tf.Tensor4D, detections: Array): Promise {\n if (!isTensor3D(imageTensor) && !isTensor4D(imageTensor)) {\n throw new Error('extractFaceTensors - expected image tensor to be 3D or 4D');\n }\n\n if (isTensor4D(imageTensor) && imageTensor.shape[0] > 1) {\n throw new Error('extractFaceTensors - batchSize > 1 not supported');\n }\n\n return tf.tidy(() => {\n const [imgHeight, imgWidth, numChannels] = imageTensor.shape.slice(isTensor4D(imageTensor) ? 1 : 0);\n\n const boxes = detections\n .map((det) => (det instanceof FaceDetection\n ? det.forSize(imgWidth, imgHeight).box\n : det))\n .map((box) => box.clipAtImageBorders(imgWidth, imgHeight));\n\n const faceTensors = boxes.map(({\n x, y, width, height,\n }) => tf.slice3d(imageTensor.as3D(imgHeight, imgWidth, numChannels), [y, x, 0], [height, width, numChannels]));\n\n return faceTensors;\n });\n}\n", "import { env } from '../env/index';\n\nexport async function fetchOrThrow(\n url: string,\n // eslint-disable-next-line no-undef\n init?: RequestInit,\n): Promise {\n const { fetch } = env.getEnv();\n const res = await fetch(url, init);\n if (!(res.status < 400)) {\n throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);\n }\n return res;\n}\n", "import { bufferToImage } from './bufferToImage';\nimport { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchImage(uri: string): Promise {\n const res = await fetchOrThrow(uri);\n const blob = await (res).blob();\n\n if (!blob.type.startsWith('image/')) {\n throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);\n }\n return bufferToImage(blob);\n}\n", "import { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchJson(uri: string): Promise {\n return (await fetchOrThrow(uri)).json();\n}\n", "import { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchNetWeights(uri: string): Promise {\n return new Float32Array(await (await fetchOrThrow(uri)).arrayBuffer());\n}\n", "import { env } from '../env/index';\n\nexport function bufferToVideo(buf: Blob): Promise {\n return new Promise((resolve, reject) => {\n if (!(buf instanceof Blob)) reject(new Error('bufferToVideo - expected buf to be of type: Blob'));\n\n const video = env.getEnv().createVideoElement();\n video.oncanplay = () => resolve(video);\n video.onerror = reject;\n video.playsInline = true;\n video.muted = true;\n video.src = URL.createObjectURL(buf);\n video.play();\n });\n}\n", "import { bufferToVideo } from './bufferToVideo';\nimport { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchVideo(uri: string): Promise {\n const res = await fetchOrThrow(uri);\n const blob = await (res).blob();\n\n if (!blob.type.startsWith('video/')) {\n throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${blob.type}, for url: ${res.url}`);\n }\n return bufferToVideo(blob);\n}\n", "export function getModelUris(uri: string | undefined, defaultModelName: string) {\n const defaultManifestFilename = `${defaultModelName}-weights_manifest.json`;\n\n if (!uri) {\n return {\n modelBaseUri: '',\n manifestUri: defaultManifestFilename,\n };\n }\n\n if (uri === '/') {\n return {\n modelBaseUri: '/',\n manifestUri: `/${defaultManifestFilename}`,\n };\n }\n // eslint-disable-next-line no-nested-ternary\n const protocol = uri.startsWith('http://') ? 'http://' : uri.startsWith('https://') ? 'https://' : '';\n uri = uri.replace(protocol, '');\n\n const parts = uri.split('/').filter((s) => s);\n\n const manifestFile = uri.endsWith('.json')\n ? parts[parts.length - 1]\n : defaultManifestFilename;\n\n let modelBaseUri = protocol + (uri.endsWith('.json') ? parts.slice(0, parts.length - 1) : parts).join('/');\n modelBaseUri = uri.startsWith('/') ? `/${modelBaseUri}` : modelBaseUri;\n\n return {\n modelBaseUri,\n manifestUri: modelBaseUri === '/' ? `/${manifestFile}` : `${modelBaseUri}/${manifestFile}`,\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { getModelUris } from '../common/getModelUris';\nimport { fetchJson } from './fetchJson';\n\nexport async function loadWeightMap(\n uri: string | undefined,\n defaultModelName: string,\n): Promise {\n const { manifestUri, modelBaseUri } = getModelUris(uri, defaultModelName);\n const manifest = await fetchJson(manifestUri);\n // if (manifest['weightsManifest']) manifest = manifest['weightsManifest'];\n return tf.io.loadWeights(manifest, modelBaseUri);\n}\n", "import { IDimensions } from '../classes/index';\nimport { getMediaDimensions } from './getMediaDimensions';\n\nexport function matchDimensions(input: IDimensions, reference: IDimensions, useMediaDimensions = false) {\n const { width, height } = useMediaDimensions\n ? getMediaDimensions(reference)\n : reference;\n input.width = width;\n input.height = height;\n return { width, height };\n}\n", "import * as tf from '../dist/tfjs.esm';\n\nimport { ParamMapping } from './common/index';\nimport { getModelUris } from './common/getModelUris';\nimport { loadWeightMap } from './dom/index';\nimport { env } from './env/index';\n\nexport abstract class NeuralNetwork {\n constructor(name: string) {\n this._name = name;\n }\n\n protected _params: TNetParams | undefined = undefined\n\n protected _paramMappings: ParamMapping[] = []\n\n public _name: any;\n\n public get params(): TNetParams | undefined { return this._params; }\n\n public get paramMappings(): ParamMapping[] { return this._paramMappings; }\n\n public get isLoaded(): boolean { return !!this.params; }\n\n public getParamFromPath(paramPath: string): tf.Tensor {\n const { obj, objProp } = this.traversePropertyPath(paramPath);\n return obj[objProp];\n }\n\n public reassignParamFromPath(paramPath: string, tensor: tf.Tensor) {\n const { obj, objProp } = this.traversePropertyPath(paramPath);\n obj[objProp].dispose();\n obj[objProp] = tensor;\n }\n\n public getParamList() {\n return this._paramMappings.map(({ paramPath }) => ({\n path: paramPath,\n tensor: this.getParamFromPath(paramPath),\n }));\n }\n\n public getTrainableParams() {\n return this.getParamList().filter((param) => param.tensor instanceof tf.Variable);\n }\n\n public getFrozenParams() {\n return this.getParamList().filter((param) => !(param.tensor instanceof tf.Variable));\n }\n\n public variable() {\n this.getFrozenParams().forEach(({ path, tensor }) => {\n this.reassignParamFromPath(path, tensor.variable());\n });\n }\n\n public freeze() {\n this.getTrainableParams().forEach(({ path, tensor: variable }) => {\n const tensor = tf.tensor(variable.dataSync());\n variable.dispose();\n this.reassignParamFromPath(path, tensor);\n });\n }\n\n public dispose(throwOnRedispose = true) {\n this.getParamList().forEach((param) => {\n if (throwOnRedispose && param.tensor.isDisposed) {\n throw new Error(`param tensor has already been disposed for path ${param.path}`);\n }\n param.tensor.dispose();\n });\n this._params = undefined;\n }\n\n public serializeParams(): Float32Array {\n return new Float32Array(\n this.getParamList()\n .map(({ tensor }) => Array.from(tensor.dataSync()) as number[])\n .reduce((flat, arr) => flat.concat(arr)),\n );\n }\n\n public async load(weightsOrUrl: Float32Array | string | undefined): Promise {\n if (weightsOrUrl instanceof Float32Array) {\n this.extractWeights(weightsOrUrl);\n return;\n }\n await this.loadFromUri(weightsOrUrl);\n }\n\n public async loadFromUri(uri: string | undefined) {\n if (uri && typeof uri !== 'string') {\n throw new Error(`${this._name}.loadFromUri - expected model uri`);\n }\n const weightMap = await loadWeightMap(uri, this.getDefaultModelName());\n this.loadFromWeightMap(weightMap);\n }\n\n public async loadFromDisk(filePath: string | undefined) {\n if (filePath && typeof filePath !== 'string') {\n throw new Error(`${this._name}.loadFromDisk - expected model file path`);\n }\n const { readFile } = env.getEnv();\n const { manifestUri, modelBaseUri } = getModelUris(filePath, this.getDefaultModelName());\n const fetchWeightsFromDisk = (filePaths: string[]) => Promise.all(filePaths.map((fp) => readFile(fp).then((buf) => buf.buffer)));\n const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk);\n const manifest = JSON.parse((await readFile(manifestUri)).toString());\n const weightMap = await loadWeights(manifest, modelBaseUri);\n this.loadFromWeightMap(weightMap);\n }\n\n public loadFromWeightMap(weightMap: tf.NamedTensorMap) {\n const { paramMappings, params } = this.extractParamsFromWeightMap(weightMap);\n this._paramMappings = paramMappings;\n this._params = params;\n }\n\n public extractWeights(weights: Float32Array) {\n const { paramMappings, params } = this.extractParams(weights);\n this._paramMappings = paramMappings;\n this._params = params;\n }\n\n private traversePropertyPath(paramPath: string) {\n if (!this.params) {\n throw new Error('traversePropertyPath - model has no loaded params');\n }\n\n const result = paramPath.split('/').reduce((res: { nextObj: any, obj?: any, objProp?: string }, objProp) => {\n // eslint-disable-next-line no-prototype-builtins\n if (!res.nextObj.hasOwnProperty(objProp)) {\n throw new Error(`traversePropertyPath - object does not have property ${objProp}, for path ${paramPath}`);\n }\n return { obj: res.nextObj, objProp, nextObj: res.nextObj[objProp] };\n }, { nextObj: this.params });\n\n const { obj, objProp } = result;\n if (!obj || !objProp || !(obj[objProp] instanceof tf.Tensor)) {\n throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);\n }\n\n return { obj, objProp };\n }\n\n protected abstract getDefaultModelName(): string\n\n // eslint-disable-next-line no-unused-vars\n protected abstract extractParamsFromWeightMap(weightMap: tf.NamedTensorMap): { params: TNetParams, paramMappings: ParamMapping[] }\n\n // eslint-disable-next-line no-unused-vars\n protected abstract extractParams(weights: Float32Array): { params: TNetParams, paramMappings: ParamMapping[] }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { SeparableConvParams } from './types';\n\nexport function depthwiseSeparableConv(\n x: tf.Tensor4D,\n params: SeparableConvParams,\n stride: [number, number],\n): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.separableConv2d(x, params.depthwise_filter, params.pointwise_filter, stride, 'same');\n out = tf.add(out, params.bias);\n return out;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, SeparableConvParams } from '../common/index';\nimport { depthwiseSeparableConv } from '../common/depthwiseSeparableConv';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function denseBlock3(\n x: tf.Tensor4D,\n denseBlockParams: DenseBlock3Params,\n isFirstLayer = false,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out1 = tf.relu(\n isFirstLayer\n ? tf.add(\n tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, [2, 2], 'same'),\n denseBlockParams.conv0.bias,\n )\n : depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, [2, 2]),\n ) as tf.Tensor4D;\n const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]);\n\n const in3 = tf.relu(tf.add(out1, out2)) as tf.Tensor4D;\n const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]);\n\n return tf.relu(tf.add(out1, tf.add(out2, out3))) as tf.Tensor4D;\n });\n}\n\nexport function denseBlock4(\n x: tf.Tensor4D,\n denseBlockParams: DenseBlock4Params,\n isFirstLayer = false,\n isScaleDown = true,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out1 = tf.relu(\n isFirstLayer\n ? tf.add(\n tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, isScaleDown ? [2, 2] : [1, 1], 'same'),\n denseBlockParams.conv0.bias,\n )\n : depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, isScaleDown ? [2, 2] : [1, 1]),\n ) as tf.Tensor4D;\n const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]);\n\n const in3 = tf.relu(tf.add(out1, out2)) as tf.Tensor4D;\n const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]);\n\n const in4 = tf.relu(tf.add(out1, tf.add(out2, out3))) as tf.Tensor4D;\n const out4 = depthwiseSeparableConv(in4, denseBlockParams.conv3, [1, 1]);\n\n return tf.relu(tf.add(out1, tf.add(out2, tf.add(out3, out4)))) as tf.Tensor4D;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from './types';\n\nexport function convLayer(\n x: tf.Tensor4D,\n params: ConvParams,\n padding: 'valid' | 'same' = 'same',\n withRelu = false,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out = tf.add(\n tf.conv2d(x, params.filters, [1, 1], padding),\n params.bias,\n ) as tf.Tensor4D;\n\n return withRelu ? tf.relu(out) : out;\n });\n}\n", "import { ParamMapping } from './types';\n\nexport function disposeUnusedWeightTensors(weightMap: any, paramMappings: ParamMapping[]) {\n Object.keys(weightMap).forEach((path) => {\n if (!paramMappings.some((pm) => pm.originalPath === path)) {\n weightMap[path].dispose();\n }\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, ExtractWeightsFunction, ParamMapping } from './types';\n\nexport function extractConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvParams => {\n const filters = tf.tensor4d(\n extractWeights(channelsIn * channelsOut * filterSize * filterSize),\n [filterSize, filterSize, channelsIn, channelsOut],\n );\n const bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return { filters, bias };\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, FCParams, ParamMapping } from './types';\n\nexport function extractFCParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (\n channelsIn: number,\n channelsOut: number,\n mappedPrefix: string,\n ): FCParams => {\n const fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]);\n const fc_bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/weights` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return {\n weights: fc_weights,\n bias: fc_bias,\n };\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\n// eslint-disable-next-line no-unused-vars\nexport type ExtractWeightsFunction = (numWeights: number) => Float32Array\n\nexport type ParamMapping = {\n originalPath?: string\n paramPath: string\n}\n\nexport type ConvParams = {\n filters: tf.Tensor4D\n bias: tf.Tensor1D\n}\n\nexport type FCParams = {\n weights: tf.Tensor2D\n bias: tf.Tensor1D\n}\n\nexport class SeparableConvParams {\n // eslint-disable-next-line no-useless-constructor\n constructor(\n // eslint-disable-next-line no-unused-vars\n public depthwise_filter: tf.Tensor4D,\n // eslint-disable-next-line no-unused-vars\n public pointwise_filter: tf.Tensor4D,\n // eslint-disable-next-line no-unused-vars\n public bias: tf.Tensor1D,\n // eslint-disable-next-line no-empty-function\n ) {}\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, ParamMapping, SeparableConvParams } from './types';\n\nexport function extractSeparableConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (channelsIn: number, channelsOut: number, mappedPrefix: string): SeparableConvParams => {\n const depthwise_filter = tf.tensor4d(extractWeights(3 * 3 * channelsIn), [3, 3, channelsIn, 1]);\n const pointwise_filter = tf.tensor4d(extractWeights(channelsIn * channelsOut), [1, 1, channelsIn, channelsOut]);\n const bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/depthwise_filter` },\n { paramPath: `${mappedPrefix}/pointwise_filter` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return new SeparableConvParams(\n depthwise_filter,\n pointwise_filter,\n bias,\n );\n };\n}\n\nexport function loadSeparableConvParamsFactory(\n // eslint-disable-next-line no-unused-vars\n extractWeightEntry: (originalPath: string, paramRank: number) => T,\n) {\n return (prefix: string): SeparableConvParams => {\n const depthwise_filter = extractWeightEntry(`${prefix}/depthwise_filter`, 4);\n const pointwise_filter = extractWeightEntry(`${prefix}/pointwise_filter`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n\n return new SeparableConvParams(\n depthwise_filter,\n pointwise_filter,\n bias,\n );\n };\n}\n", "import { isTensor } from '../utils/index';\nimport { ParamMapping } from './types';\n\nexport function extractWeightEntryFactory(weightMap: any, paramMappings: ParamMapping[]) {\n return (originalPath: string, paramRank: number, mappedPath?: string) => {\n const tensor = weightMap[originalPath];\n\n if (!isTensor(tensor, paramRank)) {\n throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor}`);\n }\n\n paramMappings.push(\n { originalPath, paramPath: mappedPath || originalPath },\n );\n\n return tensor;\n };\n}\n", "export function extractWeightsFactory(weights: Float32Array) {\n let remainingWeights = weights;\n\n function extractWeights(numWeights: number): Float32Array {\n const ret = remainingWeights.slice(0, numWeights);\n remainingWeights = remainingWeights.slice(numWeights);\n return ret;\n }\n\n function getRemainingWeights(): Float32Array {\n return remainingWeights;\n }\n\n return {\n extractWeights,\n getRemainingWeights,\n };\n}\n", "import { extractConvParamsFactory, extractSeparableConvParamsFactory, ExtractWeightsFunction, ParamMapping } from '../common/index';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n function extractDenseBlock3Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer = false): DenseBlock3Params {\n const conv0 = isFirstLayer\n ? extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv0`)\n : extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/conv0`);\n const conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv1`);\n const conv2 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv2`);\n\n return { conv0, conv1, conv2 };\n }\n\n function extractDenseBlock4Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer = false): DenseBlock4Params {\n const { conv0, conv1, conv2 } = extractDenseBlock3Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer);\n const conv3 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv3`);\n\n return {\n conv0, conv1, conv2, conv3,\n };\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params,\n };\n}\n", "import { extractWeightsFactory, ParamMapping } from '../common/index';\nimport { extractorsFactory } from './extractorsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\nexport function extractParams(weights: Float32Array): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const {\n extractDenseBlock4Params,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const dense0 = extractDenseBlock4Params(3, 32, 'dense0', true);\n const dense1 = extractDenseBlock4Params(32, 64, 'dense1');\n const dense2 = extractDenseBlock4Params(64, 128, 'dense2');\n const dense3 = extractDenseBlock4Params(128, 256, 'dense3');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: {\n dense0, dense1, dense2, dense3,\n },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from './types';\n\n// eslint-disable-next-line no-unused-vars\nexport function loadConvParamsFactory(extractWeightEntry: (originalPath: string, paramRank: number) => T) {\n return (prefix: string): ConvParams => {\n const filters = extractWeightEntry(`${prefix}/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n\n return { filters, bias };\n };\n}\n", "import { extractWeightEntryFactory, loadSeparableConvParamsFactory, ParamMapping } from '../common/index';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n const extractConvParams = loadConvParamsFactory(extractWeightEntry);\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry);\n\n function extractDenseBlock3Params(prefix: string, isFirstLayer = false): DenseBlock3Params {\n const conv0 = isFirstLayer\n ? extractConvParams(`${prefix}/conv0`)\n : extractSeparableConvParams(`${prefix}/conv0`);\n const conv1 = extractSeparableConvParams(`${prefix}/conv1`);\n const conv2 = extractSeparableConvParams(`${prefix}/conv2`);\n\n return { conv0, conv1, conv2 };\n }\n\n function extractDenseBlock4Params(prefix: string, isFirstLayer = false): DenseBlock4Params {\n const conv0 = isFirstLayer\n ? extractConvParams(`${prefix}/conv0`)\n : extractSeparableConvParams(`${prefix}/conv0`);\n const conv1 = extractSeparableConvParams(`${prefix}/conv1`);\n const conv2 = extractSeparableConvParams(`${prefix}/conv2`);\n const conv3 = extractSeparableConvParams(`${prefix}/conv3`);\n\n return {\n conv0, conv1, conv2, conv3,\n };\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params,\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common/index';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractDenseBlock4Params,\n } = loadParamsFactory(weightMap, paramMappings);\n\n const params = {\n dense0: extractDenseBlock4Params('dense0', true),\n dense1: extractDenseBlock4Params('dense1'),\n dense2: extractDenseBlock4Params('dense2'),\n dense3: extractDenseBlock4Params('dense3'),\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { denseBlock4 } from './denseBlock';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { FaceFeatureExtractorParams, IFaceFeatureExtractor } from './types';\n\nexport class FaceFeatureExtractor extends NeuralNetwork implements IFaceFeatureExtractor {\n constructor() {\n super('FaceFeatureExtractor');\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n const { params } = this;\n\n if (!params) {\n throw new Error('FaceFeatureExtractor - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n\n let out = denseBlock4(normalized, params.dense0, true);\n out = denseBlock4(out, params.dense1);\n out = denseBlock4(out, params.dense2);\n out = denseBlock4(out, params.dense3);\n out = tf.avgPool(out, [7, 7], [2, 2], 'valid');\n\n return out;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n protected getDefaultModelName(): string {\n return 'face_feature_extractor_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FCParams } from './types';\n\nexport function fullyConnectedLayer(\n x: tf.Tensor2D,\n params: FCParams,\n): tf.Tensor2D {\n return tf.tidy(() => tf.add(\n tf.matMul(x, params.weights),\n params.bias,\n ));\n}\n", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array, channelsIn: number, channelsOut: number): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings);\n\n const fc = extractFCParams(channelsIn, channelsOut, 'fc');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { fc },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractFcParams(prefix: string): FCParams {\n const weights = extractWeightEntry(`${prefix}/weights`, 2);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n return { weights, bias };\n }\n\n const params = {\n fc: extractFcParams('fc'),\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function seperateWeightMaps(weightMap: tf.NamedTensorMap) {\n const featureExtractorMap: tf.NamedTensorMap = {};\n const classifierMap: tf.NamedTensorMap = {};\n\n Object.keys(weightMap).forEach((key) => {\n const map = key.startsWith('fc') ? classifierMap : featureExtractorMap;\n map[key] = weightMap[key];\n });\n\n return { featureExtractorMap, classifierMap };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { fullyConnectedLayer } from '../common/fullyConnectedLayer';\nimport { NetInput } from '../dom/index';\nimport { FaceFeatureExtractorParams, IFaceFeatureExtractor, TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { NetParams } from './types';\nimport { seperateWeightMaps } from './util';\n\nexport abstract class FaceProcessor<\n TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams\n>\n extends NeuralNetwork {\n protected _faceFeatureExtractor: IFaceFeatureExtractor\n\n constructor(_name: string, faceFeatureExtractor: IFaceFeatureExtractor) {\n super(_name);\n this._faceFeatureExtractor = faceFeatureExtractor;\n }\n\n public get faceFeatureExtractor(): IFaceFeatureExtractor {\n return this._faceFeatureExtractor;\n }\n\n protected abstract override getDefaultModelName(): string\n\n protected abstract getClassifierChannelsIn(): number\n\n protected abstract getClassifierChannelsOut(): number\n\n public runNet(input: NetInput | tf.Tensor4D): tf.Tensor2D {\n const { params } = this;\n\n if (!params) {\n throw new Error(`${this._name} - load model before inference`);\n }\n\n return tf.tidy(() => {\n const bottleneckFeatures = input instanceof NetInput\n ? this.faceFeatureExtractor.forwardInput(input)\n : input;\n return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0], -1), params.fc);\n });\n }\n\n public override dispose(throwOnRedispose = true) {\n this.faceFeatureExtractor.dispose(throwOnRedispose);\n super.dispose(throwOnRedispose);\n }\n\n public loadClassifierParams(weights: Float32Array) {\n const { params, paramMappings } = this.extractClassifierParams(weights);\n this._params = params;\n this._paramMappings = paramMappings;\n }\n\n public extractClassifierParams(weights: Float32Array) {\n return extractParams(weights, this.getClassifierChannelsIn(), this.getClassifierChannelsOut());\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap);\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap);\n\n return extractParamsFromWeightMap(classifierMap);\n }\n\n protected extractParams(weights: Float32Array) {\n const cIn = this.getClassifierChannelsIn();\n const cOut = this.getClassifierChannelsOut();\n const classifierWeightSize = (cOut * cIn) + cOut;\n\n const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize);\n const classifierWeights = weights.slice(weights.length - classifierWeightSize);\n\n this.faceFeatureExtractor.extractWeights(featureExtractorWeights);\n return this.extractClassifierParams(classifierWeights);\n }\n}\n", "export const FACE_EXPRESSION_LABELS = ['neutral', 'happy', 'sad', 'angry', 'fearful', 'disgusted', 'surprised'];\n\nexport class FaceExpressions {\n public neutral = 0\n public happy = 0\n public sad = 0\n public angry = 0\n public fearful = 0\n public disgusted = 0\n public surprised = 0\n\n constructor(probabilities: number[] | Float32Array) {\n if (probabilities.length !== 7) {\n throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);\n }\n\n FACE_EXPRESSION_LABELS.forEach((expression, idx) => {\n this[expression] = probabilities[idx];\n });\n }\n\n asSortedArray() {\n return FACE_EXPRESSION_LABELS\n .map((expression) => ({ expression, probability: this[expression] as number }))\n .sort((e0, e1) => e1.probability - e0.probability);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor';\nimport { FaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceProcessor } from '../faceProcessor/FaceProcessor';\nimport { FaceExpressions } from './FaceExpressions';\n\nexport class FaceExpressionNet extends FaceProcessor {\n constructor(faceFeatureExtractor: FaceFeatureExtractor = new FaceFeatureExtractor()) {\n super('FaceExpressionNet', faceFeatureExtractor);\n }\n\n public forwardInput(input: NetInput | tf.Tensor4D): tf.Tensor2D {\n return tf.tidy(() => tf.softmax(this.runNet(input)));\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async predictExpressions(input: TNetInput) {\n const netInput = await toNetInput(input);\n const out = await this.forwardInput(netInput);\n const probabilitesByBatch = await Promise.all(tf.unstack(out).map(async (t) => {\n const data = t.dataSync();\n t.dispose();\n return data;\n }));\n out.dispose();\n\n const predictionsByBatch = probabilitesByBatch\n .map((probabilites) => new FaceExpressions(probabilites as Float32Array));\n\n return netInput.isBatchInput\n ? predictionsByBatch\n : predictionsByBatch[0];\n }\n\n protected getDefaultModelName(): string {\n return 'face_expression_model';\n }\n\n protected getClassifierChannelsIn(): number {\n return 256;\n }\n\n protected getClassifierChannelsOut(): number {\n return 7;\n }\n}\n", "import { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\n\nexport type WithFaceExpressions = TSource & { expressions: FaceExpressions }\n\nexport function isWithFaceExpressions(obj: any): obj is WithFaceExpressions<{}> {\n return obj.expressions instanceof FaceExpressions;\n}\n\nexport function extendWithFaceExpressions(sourceObj: TSource, expressions: FaceExpressions): WithFaceExpressions {\n const extension = { expressions };\n return { ...sourceObj, ...extension };\n}\n", "import { IPoint, Point } from '../classes/index';\nimport { FaceExpressions } from '../faceExpressionNet/index';\nimport { isWithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceExpressions, WithFaceExpressions } from '../factories/WithFaceExpressions';\nimport { round } from '../utils/index';\nimport { DrawTextField } from './DrawTextField';\n\nexport type DrawFaceExpressionsInput = FaceExpressions | WithFaceExpressions<{}>\n\nexport function drawFaceExpressions(\n canvasArg: string | HTMLCanvasElement,\n faceExpressions: DrawFaceExpressionsInput | Array,\n minConfidence = 0.1,\n textFieldAnchor?: IPoint,\n) {\n const faceExpressionsArray = Array.isArray(faceExpressions) ? faceExpressions : [faceExpressions];\n\n faceExpressionsArray.forEach((e) => {\n // eslint-disable-next-line no-nested-ternary\n const expr = e instanceof FaceExpressions\n ? e\n : (isWithFaceExpressions(e) ? e.expressions : undefined);\n if (!expr) {\n throw new Error('drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof');\n }\n\n const sorted = expr.asSortedArray();\n const resultsToDisplay = sorted.filter((exprLocal) => exprLocal.probability > minConfidence);\n\n const anchor = isWithFaceDetection(e)\n ? e.detection.box.bottomLeft\n : (textFieldAnchor || new Point(0, 0));\n\n const drawTextField = new DrawTextField(\n resultsToDisplay.map((exprLocal) => `${exprLocal.expression} (${round(exprLocal.probability)})`),\n anchor,\n );\n drawTextField.draw(canvasArg);\n });\n}\n", "import { FaceDetection } from '../classes/FaceDetection';\nimport { FaceLandmarks } from '../classes/FaceLandmarks';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { isWithFaceDetection, WithFaceDetection } from './WithFaceDetection';\n\nexport type WithFaceLandmarks<\n TSource extends WithFaceDetection<{}>,\n TFaceLandmarks extends FaceLandmarks = FaceLandmarks68 > = TSource & {\n landmarks: TFaceLandmarks,\n unshiftedLandmarks: TFaceLandmarks,\n alignedRect: FaceDetection,\n angle: { roll: number | undefined, pitch: number | undefined, yaw: number | undefined },\n }\n\nexport function isWithFaceLandmarks(obj: any): obj is WithFaceLandmarks, FaceLandmarks> {\n return isWithFaceDetection(obj)\n // eslint-disable-next-line dot-notation\n && obj['landmarks'] instanceof FaceLandmarks\n // eslint-disable-next-line dot-notation\n && obj['unshiftedLandmarks'] instanceof FaceLandmarks\n // eslint-disable-next-line dot-notation\n && obj['alignedRect'] instanceof FaceDetection;\n}\n\nfunction calculateFaceAngle(mesh) {\n // returns the angle in the plane (in radians) between the positive x-axis and the ray from (0,0) to the point (x,y)\n const radians = (a1, a2, b1, b2) => (Math.atan2(b2 - a2, b1 - a1) % Math.PI);\n // convert radians to degrees\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const degrees = (theta) => (theta * 180) / Math.PI;\n\n const angle = { roll: undefined, pitch: undefined, yaw: undefined };\n\n if (!mesh || !mesh._positions || mesh._positions.length !== 68) return angle;\n const pt = mesh._positions;\n\n // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees\n // value of 0 means center\n\n // roll is face lean from left to right\n // comparing x,y of outside corners of leftEye and rightEye\n angle.roll = -radians(pt[36]._x, pt[36]._y, pt[45]._x, pt[45]._y);\n\n // pitch is face turn from left right\n // comparing x distance of top of nose to left and right edge of face\n // precision is lacking since coordinates are not precise enough\n angle.pitch = radians(0, Math.abs(pt[0]._x - pt[30]._x) / pt[30]._x, Math.PI, Math.abs(pt[16]._x - pt[30]._x) / pt[30]._x);\n\n // yaw is face move from up to down\n // comparing size of the box around the face with top and bottom of detected landmarks\n // silly hack, but this gives us face compression on y-axis\n // e.g., tilting head up hides the forehead that doesn't have any landmarks so ratio drops\n const bottom = pt.reduce((prev, cur) => (prev < cur._y ? prev : cur._y), +Infinity);\n const top = pt.reduce((prev, cur) => (prev > cur._y ? prev : cur._y), -Infinity);\n angle.yaw = Math.PI * (mesh._imgDims._height / (top - bottom) / 1.40 - 1);\n\n return angle;\n}\n\nexport function extendWithFaceLandmarks<\n TSource extends WithFaceDetection<{}>,\n TFaceLandmarks extends FaceLandmarks = FaceLandmarks68 >(sourceObj: TSource, unshiftedLandmarks: TFaceLandmarks): WithFaceLandmarks {\n const { box: shift } = sourceObj.detection;\n const landmarks = unshiftedLandmarks.shiftBy(shift.x, shift.y);\n\n const rect = landmarks.align();\n const { imageDims } = sourceObj.detection;\n const alignedRect = new FaceDetection(sourceObj.detection.score, rect.rescale(imageDims.reverse()), imageDims);\n const angle = calculateFaceAngle(unshiftedLandmarks);\n\n const extension = {\n landmarks,\n unshiftedLandmarks,\n alignedRect,\n angle,\n };\n\n return { ...sourceObj, ...extension };\n}\n", "/* eslint-disable max-classes-per-file */\nimport { IPoint } from '../classes/index';\nimport { FaceLandmarks } from '../classes/FaceLandmarks';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { drawContour } from './drawContour';\n\nexport interface IDrawFaceLandmarksOptions {\n drawLines?: boolean\n drawPoints?: boolean\n lineWidth?: number\n pointSize?: number\n lineColor?: string\n pointColor?: string\n}\n\nexport class DrawFaceLandmarksOptions {\n public drawLines: boolean\n\n public drawPoints: boolean\n\n public lineWidth: number\n\n public pointSize: number\n\n public lineColor: string\n\n public pointColor: string\n\n constructor(options: IDrawFaceLandmarksOptions = {}) {\n const {\n drawLines = true, drawPoints = true, lineWidth, lineColor, pointSize, pointColor,\n } = options;\n this.drawLines = drawLines;\n this.drawPoints = drawPoints;\n this.lineWidth = lineWidth || 1;\n this.pointSize = pointSize || 2;\n this.lineColor = lineColor || 'rgba(0, 255, 255, 1)';\n this.pointColor = pointColor || 'rgba(255, 0, 255, 1)';\n }\n}\n\nexport class DrawFaceLandmarks {\n public faceLandmarks: FaceLandmarks\n\n public options: DrawFaceLandmarksOptions\n\n constructor(\n faceLandmarks: FaceLandmarks,\n options: IDrawFaceLandmarksOptions = {},\n ) {\n this.faceLandmarks = faceLandmarks;\n this.options = new DrawFaceLandmarksOptions(options);\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const ctx = getContext2dOrThrow(canvasArg);\n\n const {\n drawLines, drawPoints, lineWidth, lineColor, pointSize, pointColor,\n } = this.options;\n\n if (drawLines && this.faceLandmarks instanceof FaceLandmarks68) {\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n drawContour(ctx, this.faceLandmarks.getJawOutline());\n drawContour(ctx, this.faceLandmarks.getLeftEyeBrow());\n drawContour(ctx, this.faceLandmarks.getRightEyeBrow());\n drawContour(ctx, this.faceLandmarks.getNose());\n drawContour(ctx, this.faceLandmarks.getLeftEye(), true);\n drawContour(ctx, this.faceLandmarks.getRightEye(), true);\n drawContour(ctx, this.faceLandmarks.getMouth(), true);\n }\n\n if (drawPoints) {\n ctx.strokeStyle = pointColor;\n ctx.fillStyle = pointColor;\n\n const drawPoint = (pt: IPoint) => {\n ctx.beginPath();\n ctx.arc(pt.x, pt.y, pointSize, 0, 2 * Math.PI);\n ctx.fill();\n };\n this.faceLandmarks.positions.forEach(drawPoint);\n }\n }\n}\n\nexport type DrawFaceLandmarksInput = FaceLandmarks | WithFaceLandmarks>\n\nexport function drawFaceLandmarks(\n canvasArg: string | HTMLCanvasElement,\n faceLandmarks: DrawFaceLandmarksInput | Array,\n) {\n const faceLandmarksArray = Array.isArray(faceLandmarks) ? faceLandmarks : [faceLandmarks];\n faceLandmarksArray.forEach((f) => {\n // eslint-disable-next-line no-nested-ternary\n const landmarks = f instanceof FaceLandmarks\n ? f\n : (isWithFaceLandmarks(f) ? f.landmarks : undefined);\n if (!landmarks) {\n throw new Error('drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof');\n }\n\n new DrawFaceLandmarks(landmarks).draw(canvasArg);\n });\n}\n", "import { extractConvParamsFactory, extractSeparableConvParamsFactory, extractWeightsFactory } from '../common/index';\nimport { ExtractWeightsFunction, ParamMapping } from '../common/types';\nimport { range } from '../utils/index';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n function extractReductionBlockParams(channelsIn: number, channelsOut: number, mappedPrefix: string): ReductionBlockParams {\n const separable_conv0 = extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/separable_conv1`);\n const expansion_conv = extractConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/expansion_conv`);\n\n return { separable_conv0, separable_conv1, expansion_conv };\n }\n\n function extractMainBlockParams(channels: number, mappedPrefix: string): MainBlockParams {\n const separable_conv0 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv1`);\n const separable_conv2 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv2`);\n\n return { separable_conv0, separable_conv1, separable_conv2 };\n }\n\n return {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n };\n}\n\nexport function extractParams(weights: Float32Array, numMainBlocks: number): { params: TinyXceptionParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const entry_flow_conv_in = extractConvParams(3, 32, 3, 'entry_flow/conv_in');\n const entry_flow_reduction_block_0 = extractReductionBlockParams(32, 64, 'entry_flow/reduction_block_0');\n const entry_flow_reduction_block_1 = extractReductionBlockParams(64, 128, 'entry_flow/reduction_block_1');\n\n const entry_flow = {\n conv_in: entry_flow_conv_in,\n reduction_block_0: entry_flow_reduction_block_0,\n reduction_block_1: entry_flow_reduction_block_1,\n };\n\n const middle_flow = {};\n range(numMainBlocks, 0, 1).forEach((idx) => {\n middle_flow[`main_block_${idx}`] = extractMainBlockParams(128, `middle_flow/main_block_${idx}`);\n });\n\n const exit_flow_reduction_block = extractReductionBlockParams(128, 256, 'exit_flow/reduction_block');\n const exit_flow_separable_conv = extractSeparableConvParams(256, 512, 'exit_flow/separable_conv');\n\n const exit_flow = {\n reduction_block: exit_flow_reduction_block,\n separable_conv: exit_flow_separable_conv,\n };\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { entry_flow, middle_flow, exit_flow },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, loadSeparableConvParamsFactory, ParamMapping } from '../common/index';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { range } from '../utils/index';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n const extractConvParams = loadConvParamsFactory(extractWeightEntry);\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry);\n\n function extractReductionBlockParams(mappedPrefix: string): ReductionBlockParams {\n const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`);\n const expansion_conv = extractConvParams(`${mappedPrefix}/expansion_conv`);\n\n return { separable_conv0, separable_conv1, expansion_conv };\n }\n\n function extractMainBlockParams(mappedPrefix: string): MainBlockParams {\n const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`);\n const separable_conv2 = extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);\n\n return { separable_conv0, separable_conv1, separable_conv2 };\n }\n\n return {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n numMainBlocks: number,\n): { params: TinyXceptionParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n } = loadParamsFactory(weightMap, paramMappings);\n\n const entry_flow_conv_in = extractConvParams('entry_flow/conv_in');\n const entry_flow_reduction_block_0 = extractReductionBlockParams('entry_flow/reduction_block_0');\n const entry_flow_reduction_block_1 = extractReductionBlockParams('entry_flow/reduction_block_1');\n\n const entry_flow = {\n conv_in: entry_flow_conv_in,\n reduction_block_0: entry_flow_reduction_block_0,\n reduction_block_1: entry_flow_reduction_block_1,\n };\n\n const middle_flow = {};\n range(numMainBlocks, 0, 1).forEach((idx) => {\n middle_flow[`main_block_${idx}`] = extractMainBlockParams(`middle_flow/main_block_${idx}`);\n });\n\n const exit_flow_reduction_block = extractReductionBlockParams('exit_flow/reduction_block');\n const exit_flow_separable_conv = extractSeparableConvParams('exit_flow/separable_conv');\n\n const exit_flow = {\n reduction_block: exit_flow_reduction_block,\n separable_conv: exit_flow_separable_conv,\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params: { entry_flow, middle_flow, exit_flow }, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, depthwiseSeparableConv } from '../common/index';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { range } from '../utils/index';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction conv(x: tf.Tensor4D, params: ConvParams, stride: [number, number]): tf.Tensor4D {\n return tf.add(tf.conv2d(x, params.filters, stride, 'same'), params.bias);\n}\n\nfunction reductionBlock(x: tf.Tensor4D, params: ReductionBlockParams, isActivateInput = true): tf.Tensor4D {\n let out = isActivateInput ? tf.relu(x) : x;\n out = depthwiseSeparableConv(out, params.separable_conv0, [1, 1]);\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv1, [1, 1]);\n out = tf.maxPool(out, [3, 3], [2, 2], 'same');\n out = tf.add(out, conv(x, params.expansion_conv, [2, 2]));\n return out;\n}\n\nfunction mainBlock(x: tf.Tensor4D, params: MainBlockParams): tf.Tensor4D {\n let out = depthwiseSeparableConv(tf.relu(x), params.separable_conv0, [1, 1]);\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv1, [1, 1]);\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv2, [1, 1]);\n out = tf.add(out, x);\n return out;\n}\n\nexport class TinyXception extends NeuralNetwork {\n private _numMainBlocks: number\n\n constructor(numMainBlocks: number) {\n super('TinyXception');\n this._numMainBlocks = numMainBlocks;\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n const { params } = this;\n if (!params) {\n throw new Error('TinyXception - load model before inference');\n }\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n let out = tf.relu(conv(normalized, params.entry_flow.conv_in, [2, 2]));\n out = reductionBlock(out, params.entry_flow.reduction_block_0, false);\n out = reductionBlock(out, params.entry_flow.reduction_block_1);\n range(this._numMainBlocks, 0, 1).forEach((idx) => {\n out = mainBlock(out, params.middle_flow[`main_block_${idx}`]);\n });\n out = reductionBlock(out, params.exit_flow.reduction_block);\n out = tf.relu(depthwiseSeparableConv(out, params.exit_flow.separable_conv, [1, 1]));\n return out;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n protected getDefaultModelName(): string {\n return 'tiny_xception_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap, this._numMainBlocks);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights, this._numMainBlocks);\n }\n}\n", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings);\n\n const age = extractFCParams(512, 1, 'fc/age');\n const gender = extractFCParams(512, 2, 'fc/gender');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { fc: { age, gender } },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractFcParams(prefix: string): FCParams {\n const weights = extractWeightEntry(`${prefix}/weights`, 2);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n return { weights, bias };\n }\n\n const params = {\n fc: {\n age: extractFcParams('fc/age'),\n gender: extractFcParams('fc/gender'),\n },\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FCParams } from '../common/index';\n\n// eslint-disable-next-line no-shadow\nexport enum Gender {\n // eslint-disable-next-line no-unused-vars\n FEMALE = 'female',\n // eslint-disable-next-line no-unused-vars\n MALE = 'male'\n}\n\nexport type AgeAndGenderPrediction = {\n age: number\n gender: Gender\n genderProbability: number\n}\n\nexport type NetOutput = { age: tf.Tensor1D, gender: tf.Tensor2D }\n\nexport type NetParams = {\n fc: {\n age: FCParams\n gender: FCParams\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { fullyConnectedLayer } from '../common/fullyConnectedLayer';\nimport { seperateWeightMaps } from '../faceProcessor/util';\nimport { TinyXception } from '../xception/TinyXception';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { AgeAndGenderPrediction, Gender, NetOutput, NetParams } from './types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\n\nexport class AgeGenderNet extends NeuralNetwork {\n private _faceFeatureExtractor: TinyXception\n\n constructor(faceFeatureExtractor: TinyXception = new TinyXception(2)) {\n super('AgeGenderNet');\n this._faceFeatureExtractor = faceFeatureExtractor;\n }\n\n public get faceFeatureExtractor(): TinyXception {\n return this._faceFeatureExtractor;\n }\n\n public runNet(input: NetInput | tf.Tensor4D): NetOutput {\n const { params } = this;\n\n if (!params) {\n throw new Error(`${this._name} - load model before inference`);\n }\n\n return tf.tidy(() => {\n const bottleneckFeatures = input instanceof NetInput\n ? this.faceFeatureExtractor.forwardInput(input)\n : input;\n\n const pooled = tf.avgPool(bottleneckFeatures, [7, 7], [2, 2], 'valid').as2D(bottleneckFeatures.shape[0], -1);\n const age = fullyConnectedLayer(pooled, params.fc.age).as1D();\n const gender = fullyConnectedLayer(pooled, params.fc.gender);\n return { age, gender };\n });\n }\n\n public forwardInput(input: NetInput | tf.Tensor4D): NetOutput {\n return tf.tidy(() => {\n const { age, gender } = this.runNet(input);\n return { age, gender: tf.softmax(gender) };\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async predictAgeAndGender(input: TNetInput): Promise {\n const netInput = await toNetInput(input);\n const out = await this.forwardInput(netInput);\n\n const ages = tf.unstack(out.age);\n const genders = tf.unstack(out.gender);\n const ageAndGenderTensors = ages.map((ageTensor, i) => ({\n ageTensor,\n genderTensor: genders[i],\n }));\n\n const predictionsByBatch = await Promise.all(\n ageAndGenderTensors.map(async ({ ageTensor, genderTensor }) => {\n const age = (ageTensor.dataSync())[0];\n const probMale = (genderTensor.dataSync())[0];\n const isMale = probMale > 0.5;\n const gender = isMale ? Gender.MALE : Gender.FEMALE;\n const genderProbability = isMale ? probMale : (1 - probMale);\n\n ageTensor.dispose();\n genderTensor.dispose();\n return { age, gender, genderProbability };\n }),\n );\n out.age.dispose();\n out.gender.dispose();\n\n return netInput.isBatchInput ? predictionsByBatch as AgeAndGenderPrediction[] : predictionsByBatch[0] as AgeAndGenderPrediction;\n }\n\n protected getDefaultModelName(): string {\n return 'age_gender_model';\n }\n\n public override dispose(throwOnRedispose = true) {\n this.faceFeatureExtractor.dispose(throwOnRedispose);\n super.dispose(throwOnRedispose);\n }\n\n public loadClassifierParams(weights: Float32Array) {\n const { params, paramMappings } = this.extractClassifierParams(weights);\n this._params = params;\n this._paramMappings = paramMappings;\n }\n\n public extractClassifierParams(weights: Float32Array) {\n return extractParams(weights);\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap);\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap);\n\n return extractParamsFromWeightMap(classifierMap);\n }\n\n protected extractParams(weights: Float32Array) {\n const classifierWeightSize = (512 * 1 + 1) + (512 * 2 + 2);\n\n const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize);\n const classifierWeights = weights.slice(weights.length - classifierWeightSize);\n\n this.faceFeatureExtractor.extractWeights(featureExtractorWeights);\n return this.extractClassifierParams(classifierWeights);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { IDimensions, Point } from '../classes/index';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { FaceFeatureExtractorParams, TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceProcessor } from '../faceProcessor/FaceProcessor';\nimport { isEven } from '../utils/index';\n\nexport abstract class FaceLandmark68NetBase<\n TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams\n>\n extends FaceProcessor {\n public postProcess(output: tf.Tensor2D, inputSize: number, originalDimensions: IDimensions[]): tf.Tensor2D {\n const inputDimensions = originalDimensions.map(({ width, height }) => {\n const scale = inputSize / Math.max(height, width);\n return {\n width: width * scale,\n height: height * scale,\n };\n });\n\n const batchSize = inputDimensions.length;\n\n return tf.tidy(() => {\n const createInterleavedTensor = (fillX: number, fillY: number) => tf.stack([tf.fill([68], fillX, 'float32'), tf.fill([68], fillY, 'float32')], 1).as2D(1, 136).as1D();\n\n // eslint-disable-next-line no-unused-vars\n const getPadding = (batchIdx: number, cond: (w: number, h: number) => boolean): number => {\n const { width, height } = inputDimensions[batchIdx];\n return cond(width, height) ? Math.abs(width - height) / 2 : 0;\n };\n\n const getPaddingX = (batchIdx: number) => getPadding(batchIdx, (w, h) => w < h);\n const getPaddingY = (batchIdx: number) => getPadding(batchIdx, (w, h) => h < w);\n\n const landmarkTensors = output\n .mul(tf.fill([batchSize, 136], inputSize, 'float32'))\n .sub(tf.stack(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(\n getPaddingX(batchIdx),\n getPaddingY(batchIdx),\n ))))\n .div(tf.stack(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(\n inputDimensions[batchIdx].width,\n inputDimensions[batchIdx].height,\n ))));\n\n return landmarkTensors as tf.Tensor2D;\n });\n }\n\n public forwardInput(input: NetInput): tf.Tensor2D {\n return tf.tidy(() => {\n const out = this.runNet(input);\n return this.postProcess(\n out,\n input.inputSize as number,\n input.inputDimensions.map(([height, width]) => ({ height, width })),\n );\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async detectLandmarks(input: TNetInput): Promise {\n const netInput = await toNetInput(input);\n const landmarkTensors = tf.tidy(\n () => tf.unstack(this.forwardInput(netInput)),\n );\n\n const landmarksForBatch = await Promise.all(landmarkTensors.map(\n async (landmarkTensor, batchIdx) => {\n const landmarksArray = Array.from(landmarkTensor.dataSync());\n const xCoords = landmarksArray.filter((_, i) => isEven(i));\n const yCoords = landmarksArray.filter((_, i) => !isEven(i));\n\n return new FaceLandmarks68(\n Array(68).fill(0).map((_, i) => new Point(xCoords[i] as number, yCoords[i] as number)),\n {\n height: netInput.getInputHeight(batchIdx),\n width: netInput.getInputWidth(batchIdx),\n },\n );\n },\n ));\n\n landmarkTensors.forEach((t) => t.dispose());\n\n return netInput.isBatchInput ? landmarksForBatch as FaceLandmarks68[] : landmarksForBatch[0] as FaceLandmarks68;\n }\n\n protected getClassifierChannelsOut(): number {\n return 136;\n }\n}\n", "import { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor';\nimport { FaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68Net extends FaceLandmark68NetBase {\n constructor(faceFeatureExtractor: FaceFeatureExtractor = new FaceFeatureExtractor()) {\n super('FaceLandmark68Net', faceFeatureExtractor);\n }\n\n protected getDefaultModelName(): string {\n return 'face_landmark_68_model';\n }\n\n protected getClassifierChannelsIn(): number {\n return 256;\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common/index';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeightMapTiny(\n weightMap: tf.NamedTensorMap,\n): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractDenseBlock3Params,\n } = loadParamsFactory(weightMap, paramMappings);\n\n const params = {\n dense0: extractDenseBlock3Params('dense0', true),\n dense1: extractDenseBlock3Params('dense1'),\n dense2: extractDenseBlock3Params('dense2'),\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import { extractWeightsFactory, ParamMapping } from '../common/index';\nimport { extractorsFactory } from './extractorsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\nexport function extractParamsTiny(weights: Float32Array): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const {\n extractDenseBlock3Params,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const dense0 = extractDenseBlock3Params(3, 32, 'dense0', true);\n const dense1 = extractDenseBlock3Params(32, 64, 'dense1');\n const dense2 = extractDenseBlock3Params(64, 128, 'dense2');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { dense0, dense1, dense2 },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { denseBlock3 } from './denseBlock';\nimport { extractParamsFromWeightMapTiny } from './extractParamsFromWeightMapTiny';\nimport { extractParamsTiny } from './extractParamsTiny';\nimport { IFaceFeatureExtractor, TinyFaceFeatureExtractorParams } from './types';\n\nexport class TinyFaceFeatureExtractor extends NeuralNetwork implements IFaceFeatureExtractor {\n constructor() {\n super('TinyFaceFeatureExtractor');\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n const { params } = this;\n\n if (!params) {\n throw new Error('TinyFaceFeatureExtractor - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n\n let out = denseBlock3(normalized, params.dense0, true);\n out = denseBlock3(out, params.dense1);\n out = denseBlock3(out, params.dense2);\n out = tf.avgPool(out, [14, 14], [2, 2], 'valid');\n\n return out;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n protected getDefaultModelName(): string {\n return 'face_feature_extractor_tiny_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMapTiny(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParamsTiny(weights);\n }\n}\n", "import { TinyFaceFeatureExtractor } from '../faceFeatureExtractor/TinyFaceFeatureExtractor';\nimport { TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68TinyNet extends FaceLandmark68NetBase {\n constructor(faceFeatureExtractor: TinyFaceFeatureExtractor = new TinyFaceFeatureExtractor()) {\n super('FaceLandmark68TinyNet', faceFeatureExtractor);\n }\n\n protected getDefaultModelName(): string {\n return 'face_landmark_68_tiny_model';\n }\n\n protected getClassifierChannelsIn(): number {\n return 128;\n }\n}\n", "import { FaceLandmark68Net } from './FaceLandmark68Net';\n\nexport * from './FaceLandmark68Net';\nexport * from './FaceLandmark68TinyNet';\nexport class FaceLandmarkNet extends FaceLandmark68Net {}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ScaleLayerParams } from './types';\n\nexport function scale(x: tf.Tensor4D, params: ScaleLayerParams): tf.Tensor4D {\n return tf.add(tf.mul(x, params.weights), params.biases);\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { scale } from './scaleLayer';\nimport { ConvLayerParams } from './types';\n\nfunction convLayer(\n x: tf.Tensor4D,\n params: ConvLayerParams,\n strides: [number, number],\n withRelu: boolean,\n padding: 'valid' | 'same' = 'same',\n): tf.Tensor4D {\n const { filters, bias } = params.conv;\n\n let out = tf.conv2d(x, filters, strides, padding);\n out = tf.add(out, bias);\n out = scale(out, params.scale);\n return withRelu ? tf.relu(out) : out;\n}\n\nexport function conv(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [1, 1], true);\n}\n\nexport function convNoRelu(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [1, 1], false);\n}\n\nexport function convDown(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [2, 2], true, 'valid');\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, extractWeightsFactory, ExtractWeightsFunction, ParamMapping } from '../common/index';\nimport { isFloat } from '../utils/index';\nimport { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n function extractFilterValues(numFilterValues: number, numFilters: number, filterSize: number): tf.Tensor4D {\n const weights = extractWeights(numFilterValues);\n const depth = weights.length / (numFilters * filterSize * filterSize);\n\n if (isFloat(depth)) {\n throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);\n }\n\n return tf.tidy(\n () => tf.transpose(\n tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]),\n [2, 3, 1, 0],\n ),\n );\n }\n\n function extractConvParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvParams {\n const filters = extractFilterValues(numFilterValues, numFilters, filterSize);\n const bias = tf.tensor1d(extractWeights(numFilters));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return { filters, bias };\n }\n\n function extractScaleLayerParams(numWeights: number, mappedPrefix: string): ScaleLayerParams {\n const weights = tf.tensor1d(extractWeights(numWeights));\n const biases = tf.tensor1d(extractWeights(numWeights));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/weights` },\n { paramPath: `${mappedPrefix}/biases` },\n );\n\n return {\n weights,\n biases,\n };\n }\n\n function extractConvLayerParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvLayerParams {\n const conv = extractConvParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv`);\n const scale = extractScaleLayerParams(numFilters, `${mappedPrefix}/scale`);\n\n return { conv, scale };\n }\n\n function extractResidualLayerParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n isDown = false,\n ): ResidualLayerParams {\n const conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv1`);\n const conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv2`);\n\n return { conv1, conv2 };\n }\n\n return {\n extractConvLayerParams,\n extractResidualLayerParams,\n };\n}\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvLayerParams,\n extractResidualLayerParams,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down');\n const conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1');\n const conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2');\n const conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3');\n\n const conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true);\n const conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1');\n const conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2');\n const conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3');\n\n const conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true);\n const conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1');\n const conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2');\n\n const conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true);\n const conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1');\n const conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2');\n const conv256_down_out = extractResidualLayerParams(589824, 256, 3, 'conv256_down_out');\n\n const fc = tf.tidy(\n () => tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]),\n );\n paramMappings.push({ paramPath: 'fc' });\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n const params = {\n conv32_down,\n conv32_1,\n conv32_2,\n conv32_3,\n conv64_down,\n conv64_1,\n conv64_2,\n conv64_3,\n conv128_down,\n conv128_1,\n conv128_2,\n conv256_down,\n conv256_1,\n conv256_2,\n conv256_down_out,\n fc,\n };\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common/index';\nimport { isTensor2D } from '../utils/index';\nimport { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractScaleLayerParams(prefix: string): ScaleLayerParams {\n const weights = extractWeightEntry(`${prefix}/scale/weights`, 1);\n const biases = extractWeightEntry(`${prefix}/scale/biases`, 1);\n\n return { weights, biases };\n }\n\n function extractConvLayerParams(prefix: string): ConvLayerParams {\n const filters = extractWeightEntry(`${prefix}/conv/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/conv/bias`, 1);\n const scale = extractScaleLayerParams(prefix);\n\n return { conv: { filters, bias }, scale };\n }\n\n function extractResidualLayerParams(prefix: string): ResidualLayerParams {\n return {\n conv1: extractConvLayerParams(`${prefix}/conv1`),\n conv2: extractConvLayerParams(`${prefix}/conv2`),\n };\n }\n\n return {\n extractConvLayerParams,\n extractResidualLayerParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvLayerParams,\n extractResidualLayerParams,\n } = extractorsFactory(weightMap, paramMappings);\n\n const conv32_down = extractConvLayerParams('conv32_down');\n const conv32_1 = extractResidualLayerParams('conv32_1');\n const conv32_2 = extractResidualLayerParams('conv32_2');\n const conv32_3 = extractResidualLayerParams('conv32_3');\n\n const conv64_down = extractResidualLayerParams('conv64_down');\n const conv64_1 = extractResidualLayerParams('conv64_1');\n const conv64_2 = extractResidualLayerParams('conv64_2');\n const conv64_3 = extractResidualLayerParams('conv64_3');\n\n const conv128_down = extractResidualLayerParams('conv128_down');\n const conv128_1 = extractResidualLayerParams('conv128_1');\n const conv128_2 = extractResidualLayerParams('conv128_2');\n\n const conv256_down = extractResidualLayerParams('conv256_down');\n const conv256_1 = extractResidualLayerParams('conv256_1');\n const conv256_2 = extractResidualLayerParams('conv256_2');\n const conv256_down_out = extractResidualLayerParams('conv256_down_out');\n\n const { fc } = weightMap;\n paramMappings.push({ originalPath: 'fc', paramPath: 'fc' });\n\n if (!isTensor2D(fc)) {\n throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);\n }\n\n const params = {\n conv32_down,\n conv32_1,\n conv32_2,\n conv32_3,\n conv64_down,\n conv64_1,\n conv64_2,\n conv64_3,\n conv128_down,\n conv128_1,\n conv128_2,\n conv256_down,\n conv256_1,\n conv256_2,\n conv256_down_out,\n fc,\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { conv, convDown, convNoRelu } from './convLayer';\nimport { ResidualLayerParams } from './types';\n\nexport function residual(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D {\n let out = conv(x, params.conv1);\n out = convNoRelu(out, params.conv2);\n out = tf.add(out, x);\n out = tf.relu(out);\n return out;\n}\n\nexport function residualDown(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D {\n let out = convDown(x, params.conv1);\n out = convNoRelu(out, params.conv2);\n\n let pooled = tf.avgPool(x, 2, 2, 'valid') as tf.Tensor4D;\n const zeros = tf.zeros(pooled.shape);\n const isPad = pooled.shape[3] !== out.shape[3];\n const isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2];\n\n if (isAdjustShape) {\n const padShapeX = [...out.shape] as [number, number, number, number];\n padShapeX[1] = 1;\n const zerosW = tf.zeros(padShapeX);\n out = tf.concat([out, zerosW], 1);\n\n const padShapeY = [...out.shape] as [number, number, number, number];\n padShapeY[2] = 1;\n const zerosH = tf.zeros(padShapeY);\n out = tf.concat([out, zerosH], 2);\n }\n\n pooled = isPad ? tf.concat([pooled, zeros], 3) : pooled;\n out = tf.add(pooled, out) as tf.Tensor4D;\n\n out = tf.relu(out);\n return out;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { convDown } from './convLayer';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { residual, residualDown } from './residualLayer';\nimport { NetParams } from './types';\n\nexport class FaceRecognitionNet extends NeuralNetwork {\n constructor() {\n super('FaceRecognitionNet');\n }\n\n public forwardInput(input: NetInput): tf.Tensor2D {\n const { params } = this;\n\n if (!params) {\n throw new Error('FaceRecognitionNet - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(150, true), 'float32');\n\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n\n let out = convDown(normalized, params.conv32_down);\n out = tf.maxPool(out, 3, 2, 'valid');\n\n out = residual(out, params.conv32_1);\n out = residual(out, params.conv32_2);\n out = residual(out, params.conv32_3);\n\n out = residualDown(out, params.conv64_down);\n out = residual(out, params.conv64_1);\n out = residual(out, params.conv64_2);\n out = residual(out, params.conv64_3);\n\n out = residualDown(out, params.conv128_down);\n out = residual(out, params.conv128_1);\n out = residual(out, params.conv128_2);\n\n out = residualDown(out, params.conv256_down);\n out = residual(out, params.conv256_1);\n out = residual(out, params.conv256_2);\n out = residualDown(out, params.conv256_down_out);\n\n const globalAvg = out.mean([1, 2]) as tf.Tensor2D;\n const fullyConnected = tf.matMul(globalAvg, params.fc);\n\n return fullyConnected;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async computeFaceDescriptor(input: TNetInput): Promise {\n if (input?.shape?.some((dim) => dim <= 0)) return new Float32Array(128);\n const netInput = await toNetInput(input);\n const faceDescriptorTensors = tf.tidy(() => tf.unstack(this.forwardInput(netInput)));\n const faceDescriptorsForBatch = await Promise.all(faceDescriptorTensors.map((t) => t.data())) as Float32Array[];\n faceDescriptorTensors.forEach((t) => t.dispose());\n return netInput.isBatchInput ? faceDescriptorsForBatch : faceDescriptorsForBatch[0];\n }\n\n protected getDefaultModelName(): string {\n return 'face_recognition_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights);\n }\n}\n", "import { FaceRecognitionNet } from './FaceRecognitionNet';\n\nexport * from './FaceRecognitionNet';\n\nexport function createFaceRecognitionNet(weights: Float32Array) {\n const net = new FaceRecognitionNet();\n net.extractWeights(weights);\n return net;\n}\n", "export type WithFaceDescriptor = TSource & {\n descriptor: Float32Array\n}\n\nexport function extendWithFaceDescriptor<\n TSource\n>(\n sourceObj: TSource,\n descriptor: Float32Array,\n): WithFaceDescriptor {\n const extension = { descriptor };\n return { ...sourceObj, ...extension };\n}\n", "export type WithAge = TSource & {\n age: number\n}\n\nexport function isWithAge(obj: any): obj is WithAge<{}> {\n return typeof obj.age === 'number';\n}\n\nexport function extendWithAge<\n TSource\n>(\n sourceObj: TSource,\n age: number,\n): WithAge {\n const extension = { age };\n return { ...sourceObj, ...extension };\n}\n", "import { Gender } from '../ageGenderNet/types';\nimport { isValidProbablitiy } from '../utils/index';\n\nexport type WithGender = TSource & {\n gender: Gender\n genderProbability: number\n}\n\nexport function isWithGender(obj: any): obj is WithGender<{}> {\n return (obj.gender === Gender.MALE || obj.gender === Gender.FEMALE)\n && isValidProbablitiy(obj.genderProbability);\n}\n\nexport function extendWithGender<\n TSource\n>(\n sourceObj: TSource,\n gender: Gender,\n genderProbability: number,\n): WithGender {\n const extension = { gender, genderProbability };\n return { ...sourceObj, ...extension };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, ParamMapping, ConvParams, extractWeightsFactory } from '../common/index';\nimport { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n function extractDepthwiseConvParams(numChannels: number, mappedPrefix: string): MobileNetV1.DepthwiseConvParams {\n const filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]);\n const batch_norm_scale = tf.tensor1d(extractWeights(numChannels));\n const batch_norm_offset = tf.tensor1d(extractWeights(numChannels));\n const batch_norm_mean = tf.tensor1d(extractWeights(numChannels));\n const batch_norm_variance = tf.tensor1d(extractWeights(numChannels));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/batch_norm_scale` },\n { paramPath: `${mappedPrefix}/batch_norm_offset` },\n { paramPath: `${mappedPrefix}/batch_norm_mean` },\n { paramPath: `${mappedPrefix}/batch_norm_variance` },\n );\n\n return {\n filters,\n batch_norm_scale,\n batch_norm_offset,\n batch_norm_mean,\n batch_norm_variance,\n };\n }\n\n function extractConvParams(\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n isPointwiseConv?: boolean,\n ): ConvParams {\n const filters = tf.tensor4d(\n extractWeights(channelsIn * channelsOut * filterSize * filterSize),\n [filterSize, filterSize, channelsIn, channelsOut],\n );\n const bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/${isPointwiseConv ? 'batch_norm_offset' : 'bias'}` },\n );\n\n return { filters, bias };\n }\n\n function extractPointwiseConvParams(\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n ): PointwiseConvParams {\n const {\n filters,\n bias,\n } = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true);\n\n return {\n filters,\n batch_norm_offset: bias,\n };\n }\n\n function extractConvPairParams(\n channelsIn: number,\n channelsOut: number,\n mappedPrefix: string,\n ): MobileNetV1.ConvPairParams {\n const depthwise_conv = extractDepthwiseConvParams(channelsIn, `${mappedPrefix}/depthwise_conv`);\n const pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/pointwise_conv`);\n\n return { depthwise_conv, pointwise_conv };\n }\n\n function extractMobilenetV1Params(): MobileNetV1.Params {\n const conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0');\n const conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1');\n const conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2');\n const conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3');\n const conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4');\n const conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5');\n const conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6');\n const conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7');\n const conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8');\n const conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9');\n const conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10');\n const conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11');\n const conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12');\n const conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13');\n return {\n conv_0,\n conv_1,\n conv_2,\n conv_3,\n conv_4,\n conv_5,\n conv_6,\n conv_7,\n conv_8,\n conv_9,\n conv_10,\n conv_11,\n conv_12,\n conv_13,\n };\n }\n\n function extractPredictionLayerParams(): PredictionLayerParams {\n const conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0');\n const conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1');\n const conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2');\n const conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3');\n const conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4');\n const conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5');\n const conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6');\n const conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7');\n const box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor');\n const class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor');\n const box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor');\n const class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor');\n const box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor');\n const class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor');\n const box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor');\n const class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor');\n const box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor');\n const class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor');\n const box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor');\n const class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor');\n\n const box_predictor_0 = {\n box_encoding_predictor: box_encoding_0_predictor,\n class_predictor: class_predictor_0,\n };\n const box_predictor_1 = {\n box_encoding_predictor: box_encoding_1_predictor,\n class_predictor: class_predictor_1,\n };\n const box_predictor_2 = {\n box_encoding_predictor: box_encoding_2_predictor,\n class_predictor: class_predictor_2,\n };\n const box_predictor_3 = {\n box_encoding_predictor: box_encoding_3_predictor,\n class_predictor: class_predictor_3,\n };\n const box_predictor_4 = {\n box_encoding_predictor: box_encoding_4_predictor,\n class_predictor: class_predictor_4,\n };\n const box_predictor_5 = {\n box_encoding_predictor: box_encoding_5_predictor,\n class_predictor: class_predictor_5,\n };\n return {\n conv_0,\n conv_1,\n conv_2,\n conv_3,\n conv_4,\n conv_5,\n conv_6,\n conv_7,\n box_predictor_0,\n box_predictor_1,\n box_predictor_2,\n box_predictor_3,\n box_predictor_4,\n box_predictor_5,\n };\n }\n\n return {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n };\n}\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n const {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n } = extractorsFactory(extractWeights, paramMappings);\n const mobilenetv1 = extractMobilenetV1Params();\n const prediction_layer = extractPredictionLayerParams();\n const extra_dim = tf.tensor3d(\n extractWeights(5118 * 4),\n [1, 5118, 4],\n );\n const output_layer = {\n extra_dim,\n };\n paramMappings.push({ paramPath: 'output_layer/extra_dim' });\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n params: {\n mobilenetv1,\n prediction_layer,\n output_layer,\n },\n paramMappings,\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common/index';\nimport { isTensor3D } from '../utils/index';\nimport { BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractPointwiseConvParams(prefix: string, idx: number, mappedPrefix: string): PointwiseConvParams {\n const filters = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`, 4, `${mappedPrefix}/filters`);\n const batch_norm_offset = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`, 1, `${mappedPrefix}/batch_norm_offset`);\n return { filters, batch_norm_offset };\n }\n\n function extractConvPairParams(idx: number): MobileNetV1.ConvPairParams {\n const mappedPrefix = `mobilenetv1/conv_${idx}`;\n const prefixDepthwiseConv = `MobilenetV1/Conv2d_${idx}_depthwise`;\n const mappedPrefixDepthwiseConv = `${mappedPrefix}/depthwise_conv`;\n const mappedPrefixPointwiseConv = `${mappedPrefix}/pointwise_conv`;\n\n const filters = extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`, 4, `${mappedPrefixDepthwiseConv}/filters`);\n const batch_norm_scale = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_scale`);\n const batch_norm_offset = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_offset`);\n const batch_norm_mean = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_mean`);\n const batch_norm_variance = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_variance`);\n\n return {\n depthwise_conv: {\n filters,\n batch_norm_scale,\n batch_norm_offset,\n batch_norm_mean,\n batch_norm_variance,\n },\n pointwise_conv: extractPointwiseConvParams('MobilenetV1', idx, mappedPrefixPointwiseConv),\n };\n }\n\n function extractMobilenetV1Params(): MobileNetV1.Params {\n return {\n conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),\n conv_1: extractConvPairParams(1),\n conv_2: extractConvPairParams(2),\n conv_3: extractConvPairParams(3),\n conv_4: extractConvPairParams(4),\n conv_5: extractConvPairParams(5),\n conv_6: extractConvPairParams(6),\n conv_7: extractConvPairParams(7),\n conv_8: extractConvPairParams(8),\n conv_9: extractConvPairParams(9),\n conv_10: extractConvPairParams(10),\n conv_11: extractConvPairParams(11),\n conv_12: extractConvPairParams(12),\n conv_13: extractConvPairParams(13),\n };\n }\n\n function extractConvParams(prefix: string, mappedPrefix: string): ConvParams {\n const filters = extractWeightEntry(`${prefix}/weights`, 4, `${mappedPrefix}/filters`);\n const bias = extractWeightEntry(`${prefix}/biases`, 1, `${mappedPrefix}/bias`);\n return { filters, bias };\n }\n\n function extractBoxPredictorParams(idx: number): BoxPredictionParams {\n const box_encoding_predictor = extractConvParams(\n `Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,\n `prediction_layer/box_predictor_${idx}/box_encoding_predictor`,\n );\n const class_predictor = extractConvParams(\n `Prediction/BoxPredictor_${idx}/ClassPredictor`,\n `prediction_layer/box_predictor_${idx}/class_predictor`,\n );\n return { box_encoding_predictor, class_predictor };\n }\n\n function extractPredictionLayerParams(): PredictionLayerParams {\n return {\n conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),\n conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),\n conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),\n conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),\n conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),\n conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),\n conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),\n conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),\n box_predictor_0: extractBoxPredictorParams(0),\n box_predictor_1: extractBoxPredictorParams(1),\n box_predictor_2: extractBoxPredictorParams(2),\n box_predictor_3: extractBoxPredictorParams(3),\n box_predictor_4: extractBoxPredictorParams(4),\n box_predictor_5: extractBoxPredictorParams(5),\n };\n }\n\n return {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n const {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n } = extractorsFactory(weightMap, paramMappings);\n const extra_dim = weightMap['Output/extra_dim'];\n paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' });\n if (!isTensor3D(extra_dim)) {\n throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);\n }\n\n const params = {\n mobilenetv1: extractMobilenetV1Params(),\n prediction_layer: extractPredictionLayerParams(),\n output_layer: {\n extra_dim,\n },\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { PointwiseConvParams } from './types';\n\nexport function pointwiseConvLayer(x: tf.Tensor4D, params: PointwiseConvParams, strides: [number, number]) {\n return tf.tidy(() => {\n let out = tf.conv2d(x, params.filters, strides, 'same');\n out = tf.add(out, params.batch_norm_offset);\n return tf.clipByValue(out, 0, 6);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { pointwiseConvLayer } from './pointwiseConvLayer';\nimport { MobileNetV1 } from './types';\n\nconst epsilon = 0.0010000000474974513;\n\nfunction depthwiseConvLayer(x: tf.Tensor4D, params: MobileNetV1.DepthwiseConvParams, strides: [number, number]) {\n return tf.tidy(() => {\n let out = tf.depthwiseConv2d(x, params.filters, strides, 'same');\n out = tf.batchNorm(\n out,\n params.batch_norm_mean,\n params.batch_norm_variance,\n params.batch_norm_offset,\n params.batch_norm_scale,\n epsilon,\n );\n return tf.clipByValue(out, 0, 6);\n });\n}\n\nfunction getStridesForLayerIdx(layerIdx: number): [number, number] {\n return [2, 4, 6, 12].some((idx) => idx === layerIdx) ? [2, 2] : [1, 1];\n}\n\nexport function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params) {\n return tf.tidy(() => {\n let conv11;\n let out = pointwiseConvLayer(x, params.conv_0, [2, 2]);\n\n const convPairParams = [\n params.conv_1,\n params.conv_2,\n params.conv_3,\n params.conv_4,\n params.conv_5,\n params.conv_6,\n params.conv_7,\n params.conv_8,\n params.conv_9,\n params.conv_10,\n params.conv_11,\n params.conv_12,\n params.conv_13,\n ];\n\n convPairParams.forEach((param, i) => {\n const layerIdx = i + 1;\n const depthwiseConvStrides = getStridesForLayerIdx(layerIdx);\n out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);\n out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);\n if (layerIdx === 11) conv11 = out;\n });\n\n if (conv11 === null) {\n throw new Error('mobileNetV1 - output of conv layer 11 is null');\n }\n\n return {\n out,\n conv11: conv11 as any,\n };\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nfunction IOU(boxes: tf.Tensor2D, i: number, j: number) {\n const boxesData = boxes.arraySync();\n const yminI = Math.min(boxesData[i][0], boxesData[i][2]);\n const xminI = Math.min(boxesData[i][1], boxesData[i][3]);\n const ymaxI = Math.max(boxesData[i][0], boxesData[i][2]);\n const xmaxI = Math.max(boxesData[i][1], boxesData[i][3]);\n const yminJ = Math.min(boxesData[j][0], boxesData[j][2]);\n const xminJ = Math.min(boxesData[j][1], boxesData[j][3]);\n const ymaxJ = Math.max(boxesData[j][0], boxesData[j][2]);\n const xmaxJ = Math.max(boxesData[j][1], boxesData[j][3]);\n const areaI = (ymaxI - yminI) * (xmaxI - xminI);\n const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ);\n if (areaI <= 0 || areaJ <= 0) return 0.0;\n const intersectionYmin = Math.max(yminI, yminJ);\n const intersectionXmin = Math.max(xminI, xminJ);\n const intersectionYmax = Math.min(ymaxI, ymaxJ);\n const intersectionXmax = Math.min(xmaxI, xmaxJ);\n const intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) * Math.max(intersectionXmax - intersectionXmin, 0.0);\n return intersectionArea / (areaI + areaJ - intersectionArea);\n}\n\nexport function nonMaxSuppression(\n boxes: tf.Tensor2D,\n scores: number[],\n maxOutputSize: number,\n iouThreshold: number,\n scoreThreshold: number,\n): number[] {\n const numBoxes = boxes.shape[0];\n const outputSize = Math.min(maxOutputSize, numBoxes);\n\n const candidates = scores\n .map((score, boxIndex) => ({ score, boxIndex }))\n .filter((c) => c.score > scoreThreshold)\n .sort((c1, c2) => c2.score - c1.score);\n\n const suppressFunc = (x: number) => (x <= iouThreshold ? 1 : 0);\n const selected: number[] = [];\n\n candidates.forEach((c) => {\n if (selected.length >= outputSize) return;\n const originalScore = c.score;\n for (let j = selected.length - 1; j >= 0; --j) {\n const iou = IOU(boxes, c.boxIndex, selected[j]);\n if (iou === 0.0) continue;\n c.score *= suppressFunc(iou);\n if (c.score <= scoreThreshold) break;\n }\n if (originalScore === c.score) {\n selected.push(c.boxIndex);\n }\n });\n return selected;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { OutputLayerParams } from './types';\n\nfunction getCenterCoordinatesAndSizesLayer(x: tf.Tensor2D) {\n const vec = tf.unstack(tf.transpose(x, [1, 0]));\n\n const sizes = [\n tf.sub(vec[2], vec[0]),\n tf.sub(vec[3], vec[1]),\n ];\n const centers = [\n tf.add(vec[0], tf.div(sizes[0], 2)),\n tf.add(vec[1], tf.div(sizes[1], 2)),\n ];\n return { sizes, centers };\n}\n\nfunction decodeBoxesLayer(x0: tf.Tensor2D, x1: tf.Tensor2D) {\n const { sizes, centers } = getCenterCoordinatesAndSizesLayer(x0);\n\n const vec = tf.unstack(tf.transpose(x1, [1, 0]));\n const div0_out = tf.div(tf.mul(tf.exp(tf.div(vec[2], 5)), sizes[0]), 2);\n const add0_out = tf.add(tf.mul(tf.div(vec[0], 10), sizes[0]), centers[0]);\n const div1_out = tf.div(tf.mul(tf.exp(tf.div(vec[3], 5)), sizes[1]), 2);\n const add1_out = tf.add(tf.mul(tf.div(vec[1], 10), sizes[1]), centers[1]);\n\n return tf.transpose(\n tf.stack([\n tf.sub(add0_out, div0_out),\n tf.sub(add1_out, div1_out),\n tf.add(add0_out, div0_out),\n tf.add(add1_out, div1_out),\n ]),\n [1, 0],\n );\n}\n\nexport function outputLayer(boxPredictions: tf.Tensor4D, classPredictions: tf.Tensor4D, params: OutputLayerParams) {\n return tf.tidy(() => {\n const batchSize = boxPredictions.shape[0];\n\n let boxes = decodeBoxesLayer(\n tf.reshape(tf.tile(params.extra_dim, [batchSize, 1, 1]), [-1, 4]) as tf.Tensor2D,\n tf.reshape(boxPredictions, [-1, 4]) as tf.Tensor2D,\n );\n boxes = tf.reshape(boxes, [batchSize, (boxes.shape[0] / batchSize), 4]);\n\n const scoresAndClasses = tf.sigmoid(tf.slice(classPredictions, [0, 0, 1], [-1, -1, -1]));\n let scores = tf.slice(scoresAndClasses, [0, 0, 0], [-1, -1, 1]) as tf.Tensor;\n\n scores = tf.reshape(scores, [batchSize, scores.shape[1] as number]);\n\n const boxesByBatch = tf.unstack(boxes) as tf.Tensor2D[];\n const scoresByBatch = tf.unstack(scores) as tf.Tensor1D[];\n\n return { boxes: boxesByBatch, scores: scoresByBatch };\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { convLayer } from '../common/index';\nimport { BoxPredictionParams } from './types';\n\nexport function boxPredictionLayer(\n x: tf.Tensor4D,\n params: BoxPredictionParams,\n) {\n return tf.tidy(() => {\n const batchSize = x.shape[0];\n const boxPredictionEncoding = tf.reshape(\n convLayer(x, params.box_encoding_predictor),\n [batchSize, -1, 1, 4],\n );\n const classPrediction = tf.reshape(\n convLayer(x, params.class_predictor),\n [batchSize, -1, 3],\n );\n return { boxPredictionEncoding, classPrediction };\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { boxPredictionLayer } from './boxPredictionLayer';\nimport { pointwiseConvLayer } from './pointwiseConvLayer';\nimport { PredictionLayerParams } from './types';\n\nexport function predictionLayer(\n x: tf.Tensor4D,\n conv11: tf.Tensor4D,\n params: PredictionLayerParams,\n) {\n return tf.tidy(() => {\n const conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1]);\n const conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2]);\n const conv2 = pointwiseConvLayer(conv1, params.conv_2, [1, 1]);\n const conv3 = pointwiseConvLayer(conv2, params.conv_3, [2, 2]);\n const conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1]);\n const conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2]);\n const conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1]);\n const conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2]);\n\n const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0);\n const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1);\n const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2);\n const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3);\n const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4);\n const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5);\n\n const boxPredictions = tf.concat([\n boxPrediction0.boxPredictionEncoding,\n boxPrediction1.boxPredictionEncoding,\n boxPrediction2.boxPredictionEncoding,\n boxPrediction3.boxPredictionEncoding,\n boxPrediction4.boxPredictionEncoding,\n boxPrediction5.boxPredictionEncoding,\n ], 1) as tf.Tensor4D;\n\n const classPredictions = tf.concat([\n boxPrediction0.classPrediction,\n boxPrediction1.classPrediction,\n boxPrediction2.classPrediction,\n boxPrediction3.classPrediction,\n boxPrediction4.classPrediction,\n boxPrediction5.classPrediction,\n ], 1) as tf.Tensor4D;\n\n return {\n boxPredictions,\n classPredictions,\n };\n });\n}\n", "export interface ISsdMobilenetv1Options {\n minConfidence?: number\n maxResults?: number\n}\n\nexport class SsdMobilenetv1Options {\n protected _name = 'SsdMobilenetv1Options'\n\n private _minConfidence: number\n\n private _maxResults: number\n\n constructor({ minConfidence, maxResults }: ISsdMobilenetv1Options = {}) {\n this._minConfidence = minConfidence || 0.5;\n this._maxResults = maxResults || 100;\n\n if (typeof this._minConfidence !== 'number' || this._minConfidence <= 0 || this._minConfidence >= 1) {\n throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);\n }\n\n if (typeof this._maxResults !== 'number') {\n throw new Error(`${this._name} - expected maxResults to be a number`);\n }\n }\n\n get minConfidence(): number { return this._minConfidence; }\n\n get maxResults(): number { return this._maxResults; }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Rect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { mobileNetV1 } from './mobileNetV1';\nimport { nonMaxSuppression } from './nonMaxSuppression';\nimport { outputLayer } from './outputLayer';\nimport { predictionLayer } from './predictionLayer';\nimport { ISsdMobilenetv1Options, SsdMobilenetv1Options } from './SsdMobilenetv1Options';\nimport { NetParams } from './types';\n\nexport class SsdMobilenetv1 extends NeuralNetwork {\n constructor() {\n super('SsdMobilenetv1');\n }\n\n public forwardInput(input: NetInput) {\n const { params } = this;\n if (!params) throw new Error('SsdMobilenetv1 - load model before inference');\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(512, false), 'float32');\n const x = tf.sub(tf.div(batchTensor, 127.5), 1) as tf.Tensor4D; // input is normalized -1..1\n const features = mobileNetV1(x, params.mobilenetv1);\n const { boxPredictions, classPredictions } = predictionLayer(features.out, features.conv11, params.prediction_layer);\n return outputLayer(boxPredictions, classPredictions, params.output_layer);\n });\n }\n\n public async forward(input: TNetInput) {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async locateFaces(input: TNetInput, options: ISsdMobilenetv1Options = {}): Promise {\n const { maxResults, minConfidence } = new SsdMobilenetv1Options(options);\n const netInput = await toNetInput(input);\n const { boxes: _boxes, scores: _scores } = this.forwardInput(netInput);\n const boxes = _boxes[0];\n const scores = _scores[0];\n for (let i = 1; i < _boxes.length; i++) {\n _boxes[i].dispose();\n _scores[i].dispose();\n }\n const scoresData = Array.from(scores.dataSync());\n const iouThreshold = 0.5;\n const indices = nonMaxSuppression(boxes, scoresData as number[], maxResults, iouThreshold, minConfidence);\n const reshapedDims = netInput.getReshapedInputDimensions(0);\n const inputSize = netInput.inputSize as number;\n const padX = inputSize / reshapedDims.width;\n const padY = inputSize / reshapedDims.height;\n const boxesData = boxes.arraySync();\n const results = indices\n .map((idx) => {\n const [top, bottom] = [\n Math.max(0, boxesData[idx][0]),\n Math.min(1.0, boxesData[idx][2]),\n ].map((val) => val * padY);\n const [left, right] = [\n Math.max(0, boxesData[idx][1]),\n Math.min(1.0, boxesData[idx][3]),\n ].map((val) => val * padX);\n return new FaceDetection(\n scoresData[idx] as number,\n new Rect(left, top, right - left, bottom - top),\n { height: netInput.getInputHeight(0), width: netInput.getInputWidth(0) },\n );\n });\n boxes.dispose();\n scores.dispose();\n return results;\n }\n\n protected getDefaultModelName(): string {\n return 'ssd_mobilenetv1_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights);\n }\n}\n", "import { SsdMobilenetv1 } from './SsdMobilenetv1';\n\nexport * from './SsdMobilenetv1';\nexport * from './SsdMobilenetv1Options';\n\nexport function createSsdMobilenetv1(weights: Float32Array) {\n const net = new SsdMobilenetv1();\n net.extractWeights(weights);\n return net;\n}\n\nexport function createFaceDetectionNet(weights: Float32Array) {\n return createSsdMobilenetv1(weights);\n}\n\n// alias for backward compatibily\nexport class FaceDetectionNet extends SsdMobilenetv1 {}\n", "import { Point } from '../classes/index';\n\nexport const IOU_THRESHOLD = 0.4;\n\nexport const BOX_ANCHORS = [\n new Point(0.738768, 0.874946),\n new Point(2.42204, 2.65704),\n new Point(4.30971, 7.04493),\n new Point(10.246, 4.59428),\n new Point(12.6868, 11.8741),\n];\n\nexport const BOX_ANCHORS_SEPARABLE = [\n new Point(1.603231, 2.094468),\n new Point(6.041143, 7.080126),\n new Point(2.882459, 3.518061),\n new Point(4.266906, 5.178857),\n new Point(9.041765, 10.66308),\n];\n\nexport const MEAN_RGB_SEPARABLE: [number, number, number] = [117.001, 114.697, 97.404];\n\nexport const DEFAULT_MODEL_NAME = 'tiny_yolov2_model';\nexport const DEFAULT_MODEL_NAME_SEPARABLE_CONV = 'tiny_yolov2_separable_conv_model';\n", "import { Point } from '../classes/Point';\n\nexport type TinyYolov2Config = {\n withSeparableConvs: boolean\n iouThreshold: number\n anchors: Point[]\n classes: string[]\n meanRgb?: [number, number, number]\n withClassScores?: boolean,\n filterSizes?: number[]\n isFirstLayerConv2d?: boolean\n}\n\nconst isNumber = (arg: any) => typeof arg === 'number';\n\nexport function validateConfig(config: any) {\n if (!config) {\n throw new Error(`invalid config: ${config}`);\n }\n\n if (typeof config.withSeparableConvs !== 'boolean') {\n throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config.withSeparableConvs}`);\n }\n\n if (!isNumber(config.iouThreshold) || config.iouThreshold < 0 || config.iouThreshold > 1.0) {\n throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config.iouThreshold}`);\n }\n\n if (\n !Array.isArray(config.classes)\n || !config.classes.length\n || !config.classes.every((c: any) => typeof c === 'string')\n ) {\n throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config.classes)}`);\n }\n\n if (\n !Array.isArray(config.anchors)\n || !config.anchors.length\n || !config.anchors.map((a: any) => a || {}).every((a: any) => isNumber(a.x) && isNumber(a.y))\n ) {\n throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config.anchors)}`);\n }\n\n if (config.meanRgb && (\n !Array.isArray(config.meanRgb)\n || config.meanRgb.length !== 3\n || !config.meanRgb.every(isNumber)\n )) {\n throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config.meanRgb)}`);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function leaky(x: tf.Tensor4D): tf.Tensor4D {\n return tf.tidy(() => {\n const min = tf.mul(x, tf.scalar(0.10000000149011612));\n return tf.add(tf.relu(tf.sub(x, min)), min);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { leaky } from './leaky';\nimport { ConvWithBatchNorm } from './types';\n\nexport function convWithBatchNorm(x: tf.Tensor4D, params: ConvWithBatchNorm): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]) as tf.Tensor4D;\n out = tf.conv2d(out, params.conv.filters, [1, 1], 'valid');\n out = tf.sub(out, params.bn.sub);\n out = tf.mul(out, params.bn.truediv);\n out = tf.add(out, params.conv.bias);\n return leaky(out);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { SeparableConvParams } from '../common/types';\nimport { leaky } from './leaky';\n\nexport function depthwiseSeparableConv(x: tf.Tensor4D, params: SeparableConvParams): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]) as tf.Tensor4D;\n out = tf.separableConv2d(out, params.depthwise_filter, params.pointwise_filter, [1, 1], 'valid');\n out = tf.add(out, params.bias);\n return leaky(out);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { extractConvParamsFactory } from '../common/index';\nimport { extractSeparableConvParamsFactory } from '../common/extractSeparableConvParamsFactory';\nimport { extractWeightsFactory } from '../common/extractWeightsFactory';\nimport { ExtractWeightsFunction, ParamMapping } from '../common/types';\nimport { TinyYolov2Config } from './config';\nimport { BatchNorm, ConvWithBatchNorm, TinyYolov2NetParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n\n function extractBatchNormParams(size: number, mappedPrefix: string): BatchNorm {\n const sub = tf.tensor1d(extractWeights(size));\n const truediv = tf.tensor1d(extractWeights(size));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/sub` },\n { paramPath: `${mappedPrefix}/truediv` },\n );\n return { sub, truediv };\n }\n\n function extractConvWithBatchNormParams(channelsIn: number, channelsOut: number, mappedPrefix: string): ConvWithBatchNorm {\n const conv = extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv`);\n const bn = extractBatchNormParams(channelsOut, `${mappedPrefix}/bn`);\n return { conv, bn };\n }\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n return {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n };\n}\n\nexport function extractParams(\n weights: Float32Array,\n config: TinyYolov2Config,\n boxEncodingSize: number,\n filterSizes: number[],\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const paramMappings: ParamMapping[] = [];\n const {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n } = extractorsFactory(extractWeights, paramMappings);\n let params: TinyYolov2NetParams;\n\n if (config.withSeparableConvs) {\n const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes;\n const conv0 = config.isFirstLayerConv2d\n ? extractConvParams(s0, s1, 3, 'conv0')\n : extractSeparableConvParams(s0, s1, 'conv0');\n const conv1 = extractSeparableConvParams(s1, s2, 'conv1');\n const conv2 = extractSeparableConvParams(s2, s3, 'conv2');\n const conv3 = extractSeparableConvParams(s3, s4, 'conv3');\n const conv4 = extractSeparableConvParams(s4, s5, 'conv4');\n const conv5 = extractSeparableConvParams(s5, s6, 'conv5');\n const conv6 = s7 ? extractSeparableConvParams(s6, s7, 'conv6') : undefined;\n const conv7 = s8 ? extractSeparableConvParams(s7, s8, 'conv7') : undefined;\n const conv8 = extractConvParams(s8 || s7 || s6, 5 * boxEncodingSize, 1, 'conv8');\n params = {\n conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8,\n };\n } else {\n const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes;\n const conv0 = extractConvWithBatchNormParams(s0, s1, 'conv0');\n const conv1 = extractConvWithBatchNormParams(s1, s2, 'conv1');\n const conv2 = extractConvWithBatchNormParams(s2, s3, 'conv2');\n const conv3 = extractConvWithBatchNormParams(s3, s4, 'conv3');\n const conv4 = extractConvWithBatchNormParams(s4, s5, 'conv4');\n const conv5 = extractConvWithBatchNormParams(s5, s6, 'conv5');\n const conv6 = extractConvWithBatchNormParams(s6, s7, 'conv6');\n const conv7 = extractConvWithBatchNormParams(s7, s8, 'conv7');\n const conv8 = extractConvParams(s8, 5 * boxEncodingSize, 1, 'conv8');\n params = {\n conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8,\n };\n }\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from '../common/index';\nimport { disposeUnusedWeightTensors } from '../common/disposeUnusedWeightTensors';\nimport { loadSeparableConvParamsFactory } from '../common/extractSeparableConvParamsFactory';\nimport { extractWeightEntryFactory } from '../common/extractWeightEntryFactory';\nimport { ParamMapping } from '../common/types';\nimport { TinyYolov2Config } from './config';\nimport { BatchNorm, ConvWithBatchNorm, TinyYolov2NetParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractBatchNormParams(prefix: string): BatchNorm {\n const sub = extractWeightEntry(`${prefix}/sub`, 1);\n const truediv = extractWeightEntry(`${prefix}/truediv`, 1);\n return { sub, truediv };\n }\n\n function extractConvParams(prefix: string): ConvParams {\n const filters = extractWeightEntry(`${prefix}/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n return { filters, bias };\n }\n\n function extractConvWithBatchNormParams(prefix: string): ConvWithBatchNorm {\n const conv = extractConvParams(`${prefix}/conv`);\n const bn = extractBatchNormParams(`${prefix}/bn`);\n return { conv, bn };\n }\n\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry);\n return {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n config: TinyYolov2Config,\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n } = extractorsFactory(weightMap, paramMappings);\n\n let params: TinyYolov2NetParams;\n\n if (config.withSeparableConvs) {\n // eslint-disable-next-line no-mixed-operators\n const numFilters = (config.filterSizes && config.filterSizes.length || 9);\n params = {\n conv0: config.isFirstLayerConv2d ? extractConvParams('conv0') : extractSeparableConvParams('conv0'),\n conv1: extractSeparableConvParams('conv1'),\n conv2: extractSeparableConvParams('conv2'),\n conv3: extractSeparableConvParams('conv3'),\n conv4: extractSeparableConvParams('conv4'),\n conv5: extractSeparableConvParams('conv5'),\n conv6: numFilters > 7 ? extractSeparableConvParams('conv6') : undefined,\n conv7: numFilters > 8 ? extractSeparableConvParams('conv7') : undefined,\n conv8: extractConvParams('conv8'),\n };\n } else {\n params = {\n conv0: extractConvWithBatchNormParams('conv0'),\n conv1: extractConvWithBatchNormParams('conv1'),\n conv2: extractConvWithBatchNormParams('conv2'),\n conv3: extractConvWithBatchNormParams('conv3'),\n conv4: extractConvWithBatchNormParams('conv4'),\n conv5: extractConvWithBatchNormParams('conv5'),\n conv6: extractConvWithBatchNormParams('conv6'),\n conv7: extractConvWithBatchNormParams('conv7'),\n conv8: extractConvParams('conv8'),\n };\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n return { params, paramMappings };\n}\n", "export interface ITinyYolov2Options {\n inputSize?: number\n scoreThreshold?: number\n}\n\nexport class TinyYolov2Options {\n protected _name = 'TinyYolov2Options'\n\n private _inputSize: number\n\n private _scoreThreshold: number\n\n constructor({ inputSize, scoreThreshold }: ITinyYolov2Options = {}) {\n this._inputSize = inputSize || 416;\n this._scoreThreshold = scoreThreshold || 0.5;\n\n if (typeof this._inputSize !== 'number' || this._inputSize % 32 !== 0) {\n throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);\n }\n\n if (typeof this._scoreThreshold !== 'number' || this._scoreThreshold <= 0 || this._scoreThreshold >= 1) {\n throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`);\n }\n }\n\n get inputSize(): number { return this._inputSize; }\n\n get scoreThreshold(): number { return this._scoreThreshold; }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { BoundingBox } from '../classes/BoundingBox';\nimport { Dimensions } from '../classes/Dimensions';\nimport { ObjectDetection } from '../classes/ObjectDetection';\nimport { convLayer } from '../common/index';\nimport { ConvParams, SeparableConvParams } from '../common/types';\nimport { toNetInput } from '../dom/index';\nimport { NetInput } from '../dom/NetInput';\nimport { TNetInput } from '../dom/types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { sigmoid } from '../ops/index';\nimport { nonMaxSuppression } from '../ops/nonMaxSuppression';\nimport { normalize } from '../ops/normalize';\nimport { TinyYolov2Config, validateConfig } from './config';\nimport { convWithBatchNorm } from './convWithBatchNorm';\nimport { depthwiseSeparableConv } from './depthwiseSeparableConv';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { leaky } from './leaky';\nimport { ITinyYolov2Options, TinyYolov2Options } from './TinyYolov2Options';\nimport { DefaultTinyYolov2NetParams, MobilenetParams, TinyYolov2NetParams } from './types';\n\nexport class TinyYolov2Base extends NeuralNetwork {\n public static DEFAULT_FILTER_SIZES = [3, 16, 32, 64, 128, 256, 512, 1024, 1024];\n\n private _config: TinyYolov2Config\n\n constructor(config: TinyYolov2Config) {\n super('TinyYolov2');\n validateConfig(config);\n this._config = config;\n }\n\n public get config(): TinyYolov2Config {\n return this._config;\n }\n\n public get withClassScores(): boolean {\n return this.config.withClassScores || this.config.classes.length > 1;\n }\n\n public get boxEncodingSize(): number {\n return 5 + (this.withClassScores ? this.config.classes.length : 0);\n }\n\n public runTinyYolov2(x: tf.Tensor4D, params: DefaultTinyYolov2NetParams): tf.Tensor4D {\n let out = convWithBatchNorm(x, params.conv0);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv1);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv2);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv3);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv4);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv5);\n out = tf.maxPool(out, [2, 2], [1, 1], 'same');\n out = convWithBatchNorm(out, params.conv6);\n out = convWithBatchNorm(out, params.conv7);\n return convLayer(out, params.conv8, 'valid', false);\n }\n\n public runMobilenet(x: tf.Tensor4D, params: MobilenetParams): tf.Tensor4D {\n let out = this.config.isFirstLayerConv2d\n ? leaky(convLayer(x, params.conv0 as ConvParams, 'valid', false))\n : depthwiseSeparableConv(x, params.conv0 as SeparableConvParams);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv1);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv2);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv3);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv4);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv5);\n out = tf.maxPool(out, [2, 2], [1, 1], 'same');\n out = params.conv6 ? depthwiseSeparableConv(out, params.conv6) : out;\n out = params.conv7 ? depthwiseSeparableConv(out, params.conv7) : out;\n return convLayer(out, params.conv8, 'valid', false);\n }\n\n public forwardInput(input: NetInput, inputSize: number): tf.Tensor4D {\n const { params } = this;\n\n if (!params) {\n throw new Error('TinyYolov2 - load model before inference');\n }\n\n return tf.tidy(() => {\n let batchTensor = tf.cast(input.toBatchTensor(inputSize, false), 'float32');\n batchTensor = this.config.meanRgb\n ? normalize(batchTensor, this.config.meanRgb)\n : batchTensor;\n batchTensor = batchTensor.div(255) as tf.Tensor4D;\n return this.config.withSeparableConvs\n ? this.runMobilenet(batchTensor, params as MobilenetParams)\n : this.runTinyYolov2(batchTensor, params as DefaultTinyYolov2NetParams);\n });\n }\n\n public async forward(input: TNetInput, inputSize: number): Promise {\n return this.forwardInput(await toNetInput(input), inputSize);\n }\n\n public async detect(input: TNetInput, forwardParams: ITinyYolov2Options = {}): Promise {\n const { inputSize, scoreThreshold } = new TinyYolov2Options(forwardParams);\n const netInput = await toNetInput(input);\n const out = await this.forwardInput(netInput, inputSize);\n const out0 = tf.tidy(() => tf.unstack(out)[0].expandDims()) as tf.Tensor4D;\n const inputDimensions = {\n width: netInput.getInputWidth(0),\n height: netInput.getInputHeight(0),\n };\n\n const results = await this.extractBoxes(out0, netInput.getReshapedInputDimensions(0), scoreThreshold);\n out.dispose();\n out0.dispose();\n\n const boxes = results.map((res) => res.box);\n const scores = results.map((res) => res.score);\n const classScores = results.map((res) => res.classScore);\n const classNames = results.map((res) => this.config.classes[res.label]);\n\n const indices = nonMaxSuppression(\n boxes.map((box) => box.rescale(inputSize)),\n scores,\n this.config.iouThreshold,\n true,\n );\n\n const detections = indices.map((idx) => new ObjectDetection(\n scores[idx],\n classScores[idx],\n classNames[idx],\n boxes[idx],\n inputDimensions,\n ));\n return detections;\n }\n\n protected getDefaultModelName(): string {\n return '';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap, this.config);\n }\n\n protected extractParams(weights: Float32Array) {\n const filterSizes = this.config.filterSizes || TinyYolov2Base.DEFAULT_FILTER_SIZES;\n\n const numFilters = filterSizes ? filterSizes.length : undefined;\n if (numFilters !== 7 && numFilters !== 8 && numFilters !== 9) {\n throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);\n }\n return extractParams(weights, this.config, this.boxEncodingSize, filterSizes);\n }\n\n protected async extractBoxes(\n outputTensor: tf.Tensor4D,\n inputBlobDimensions: Dimensions,\n scoreThreshold?: number,\n ) {\n const { width, height } = inputBlobDimensions;\n const inputSize = Math.max(width, height);\n const correctionFactorX = inputSize / width;\n const correctionFactorY = inputSize / height;\n\n const numCells = outputTensor.shape[1];\n const numBoxes = this.config.anchors.length;\n\n const [boxesTensor, scoresTensor, classScoresTensor] = tf.tidy(() => {\n const reshaped = outputTensor.reshape([numCells, numCells, numBoxes, this.boxEncodingSize]);\n\n const boxes = reshaped.slice([0, 0, 0, 0], [numCells, numCells, numBoxes, 4]);\n const scores = reshaped.slice([0, 0, 0, 4], [numCells, numCells, numBoxes, 1]);\n const classScores = this.withClassScores\n ? tf.softmax(reshaped.slice([0, 0, 0, 5], [numCells, numCells, numBoxes, this.config.classes.length]), 3)\n : tf.scalar(0);\n return [boxes, scores, classScores];\n });\n\n const results = [] as any;\n const scoresData = await scoresTensor.array();\n const boxesData = await boxesTensor.array();\n for (let row = 0; row < numCells; row++) {\n for (let col = 0; col < numCells; col++) {\n for (let anchor = 0; anchor < numBoxes; anchor++) {\n const score = sigmoid(scoresData[row][col][anchor][0]);\n if (!scoreThreshold || score > scoreThreshold) {\n const ctX = ((col + sigmoid(boxesData[row][col][anchor][0])) / numCells) * correctionFactorX;\n const ctY = ((row + sigmoid(boxesData[row][col][anchor][1])) / numCells) * correctionFactorY;\n const widthLocal = ((Math.exp(boxesData[row][col][anchor][2]) * this.config.anchors[anchor].x) / numCells) * correctionFactorX;\n const heightLocal = ((Math.exp(boxesData[row][col][anchor][3]) * this.config.anchors[anchor].y) / numCells) * correctionFactorY;\n const x = (ctX - (widthLocal / 2));\n const y = (ctY - (heightLocal / 2));\n const pos = { row, col, anchor };\n const { classScore, label } = this.withClassScores\n ? await this.extractPredictedClass(classScoresTensor as tf.Tensor4D, pos)\n : { classScore: 1, label: 0 };\n results.push({\n box: new BoundingBox(x, y, x + widthLocal, y + heightLocal),\n score,\n classScore: score * classScore,\n label,\n ...pos,\n });\n }\n }\n }\n }\n\n boxesTensor.dispose();\n scoresTensor.dispose();\n classScoresTensor.dispose();\n return results;\n }\n\n private async extractPredictedClass(classesTensor: tf.Tensor4D, pos: { row: number, col: number, anchor: number }) {\n const { row, col, anchor } = pos;\n const classesData = await classesTensor.array();\n return Array(this.config.classes.length).fill(0)\n .map((_, i) => classesData[row][col][anchor][i])\n .map((classScore, label) => ({\n classScore,\n label,\n }))\n .reduce((max, curr) => (max.classScore > curr.classScore ? max : curr));\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection, Point } from '../classes/index';\nimport { ParamMapping } from '../common/types';\nimport { TNetInput } from '../dom/types';\nimport {\n BOX_ANCHORS,\n BOX_ANCHORS_SEPARABLE,\n DEFAULT_MODEL_NAME,\n DEFAULT_MODEL_NAME_SEPARABLE_CONV,\n IOU_THRESHOLD,\n MEAN_RGB_SEPARABLE,\n} from './const';\nimport { TinyYolov2Base } from './TinyYolov2Base';\nimport { ITinyYolov2Options } from './TinyYolov2Options';\nimport { TinyYolov2NetParams } from './types';\n\nexport class TinyYolov2 extends TinyYolov2Base {\n constructor(withSeparableConvs = true) {\n const config = {\n withSeparableConvs,\n iouThreshold: IOU_THRESHOLD,\n classes: ['face'],\n ...(withSeparableConvs\n ? {\n anchors: BOX_ANCHORS_SEPARABLE,\n meanRgb: MEAN_RGB_SEPARABLE,\n }\n : {\n anchors: BOX_ANCHORS,\n withClassScores: true,\n }),\n };\n\n super(config);\n }\n\n public get withSeparableConvs(): boolean {\n return this.config.withSeparableConvs;\n }\n\n public get anchors(): Point[] {\n return this.config.anchors;\n }\n\n public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise {\n const objectDetections = await this.detect(input, forwardParams);\n return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }));\n }\n\n protected override getDefaultModelName(): string {\n return this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME;\n }\n\n protected override extractParamsFromWeightMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n return super.extractParamsFromWeightMap(weightMap);\n }\n}\n", "import { TinyYolov2 } from './TinyYolov2';\n\nexport * from './TinyYolov2Options';\nexport * from './config';\nexport * from './types';\nexport { TinyYolov2 };\n\nexport function createTinyYolov2(weights: Float32Array, withSeparableConvs = true) {\n const net = new TinyYolov2(withSeparableConvs);\n net.extractWeights(weights);\n return net;\n}\n", "import { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2/index';\n\nexport type ITinyFaceDetectorOptions = ITinyYolov2Options\n\nexport class TinyFaceDetectorOptions extends TinyYolov2Options {\n protected override _name = 'TinyFaceDetectorOptions'\n}\n", "export class ComposableTask {\n // eslint-disable-next-line no-unused-vars\n public async then(onfulfilled: (value: T) => T | PromiseLike): Promise {\n return onfulfilled(await this.run());\n }\n\n public async run(): Promise {\n throw new Error('ComposableTask - run is not implemented');\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom/index';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\n\nexport async function extractAllFacesAndComputeResults, TResult>(\n parentResults: TSource[],\n input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n computeResults: (faces: Array) => Promise,\n extractedFaces?: Array | null,\n // eslint-disable-next-line no-unused-vars\n getRectForAlignment: (parentResult: WithFaceLandmarks) => FaceDetection = ({ alignedRect }) => alignedRect,\n) {\n const faceBoxes = parentResults.map((parentResult) => (isWithFaceLandmarks(parentResult)\n ? getRectForAlignment(parentResult)\n : parentResult.detection));\n const faces: Array = extractedFaces || (\n input instanceof tf.Tensor\n ? await extractFaceTensors(input, faceBoxes)\n : await extractFaces(input, faceBoxes)\n );\n const results = await computeResults(faces);\n faces.forEach((f) => f instanceof tf.Tensor && f.dispose());\n return results;\n}\n\nexport async function extractSingleFaceAndComputeResult, TResult>(\n parentResult: TSource,\n input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n computeResult: (face: HTMLCanvasElement | tf.Tensor3D) => Promise,\n extractedFaces?: Array | null,\n // eslint-disable-next-line no-unused-vars\n getRectForAlignment?: (parentResultLocal: WithFaceLandmarks) => FaceDetection,\n) {\n return extractAllFacesAndComputeResults(\n [parentResult],\n input,\n async (faces) => computeResult(faces[0]),\n extractedFaces,\n getRectForAlignment,\n );\n}\n", "import { Point } from '../classes/index';\n\nexport const IOU_THRESHOLD = 0.4;\n\nexport const BOX_ANCHORS = [\n new Point(1.603231, 2.094468),\n new Point(6.041143, 7.080126),\n new Point(2.882459, 3.518061),\n new Point(4.266906, 5.178857),\n new Point(9.041765, 10.66308),\n];\n\nexport const MEAN_RGB: [number, number, number] = [117.001, 114.697, 97.404];\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection, Point } from '../classes/index';\nimport { ParamMapping } from '../common/index';\nimport { TNetInput } from '../dom/index';\nimport { ITinyYolov2Options } from '../tinyYolov2/index';\nimport { TinyYolov2Base } from '../tinyYolov2/TinyYolov2Base';\nimport { TinyYolov2NetParams } from '../tinyYolov2/types';\nimport { BOX_ANCHORS, IOU_THRESHOLD, MEAN_RGB } from './const';\n\nexport class TinyFaceDetector extends TinyYolov2Base {\n constructor() {\n const config = {\n withSeparableConvs: true,\n iouThreshold: IOU_THRESHOLD,\n classes: ['face'],\n anchors: BOX_ANCHORS,\n meanRgb: MEAN_RGB,\n isFirstLayerConv2d: true,\n filterSizes: [3, 16, 32, 64, 128, 256, 512],\n };\n\n super(config);\n }\n\n public get anchors(): Point[] {\n return this.config.anchors;\n }\n\n public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise {\n const objectDetections = await this.detect(input, forwardParams);\n return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }));\n }\n\n protected override getDefaultModelName(): string {\n return 'tiny_face_detector_model';\n }\n\n protected override extractParamsFromWeightMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n return super.extractParamsFromWeightMap(weightMap);\n }\n}\n", "import { AgeGenderNet } from '../ageGenderNet/AgeGenderNet';\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { TNetInput } from '../dom/index';\nimport { FaceExpressionNet } from '../faceExpressionNet/FaceExpressionNet';\nimport { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\nimport { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';\nimport { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';\nimport { FaceRecognitionNet } from '../faceRecognitionNet/FaceRecognitionNet';\nimport { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { ITinyYolov2Options, TinyYolov2 } from '../tinyYolov2/index';\n\nexport const nets = {\n ssdMobilenetv1: new SsdMobilenetv1(),\n tinyFaceDetector: new TinyFaceDetector(),\n tinyYolov2: new TinyYolov2(),\n faceLandmark68Net: new FaceLandmark68Net(),\n faceLandmark68TinyNet: new FaceLandmark68TinyNet(),\n faceRecognitionNet: new FaceRecognitionNet(),\n faceExpressionNet: new FaceExpressionNet(),\n ageGenderNet: new AgeGenderNet(),\n};\n\n/**\n * Attempts to detect all faces in an image using SSD Mobilenetv1 Network.\n *\n * @param input The input image.\n * @param options (optional, default: see SsdMobilenetv1Options constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const ssdMobilenetv1 = (input: TNetInput, options: SsdMobilenetv1Options): Promise => nets.ssdMobilenetv1.locateFaces(input, options);\n\n/**\n * Attempts to detect all faces in an image using the Tiny Face Detector.\n *\n * @param input The input image.\n * @param options (optional, default: see TinyFaceDetectorOptions constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const tinyFaceDetector = (input: TNetInput, options: TinyFaceDetectorOptions): Promise => nets.tinyFaceDetector.locateFaces(input, options);\n\n/**\n * Attempts to detect all faces in an image using the Tiny Yolov2 Network.\n *\n * @param input The input image.\n * @param options (optional, default: see TinyYolov2Options constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const tinyYolov2 = (input: TNetInput, options: ITinyYolov2Options): Promise => nets.tinyYolov2.locateFaces(input, options);\n\n/**\n * Detects the 68 point face landmark positions of the face shown in an image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns 68 point face landmarks or array thereof in case of batch input.\n */\nexport const detectFaceLandmarks = (input: TNetInput): Promise => nets.faceLandmark68Net.detectLandmarks(input);\n\n/**\n * Detects the 68 point face landmark positions of the face shown in an image\n * using a tinier version of the 68 point face landmark model, which is slightly\n * faster at inference, but also slightly less accurate.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns 68 point face landmarks or array thereof in case of batch input.\n */\nexport const detectFaceLandmarksTiny = (input: TNetInput): Promise => nets.faceLandmark68TinyNet.detectLandmarks(input);\n\n/**\n * Computes a 128 entry vector (face descriptor / face embeddings) from the face shown in an image,\n * which uniquely represents the features of that persons face. The computed face descriptor can\n * be used to measure the similarity between faces, by computing the euclidean distance of two\n * face descriptors.\n *\n * @param inputs The face image extracted from the aligned bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Face descriptor with 128 entries or array thereof in case of batch input.\n */\nexport const computeFaceDescriptor = (input: TNetInput): Promise => nets.faceRecognitionNet.computeFaceDescriptor(input);\n\n/**\n * Recognizes the facial expressions from a face image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Facial expressions with corresponding probabilities or array thereof in case of batch input.\n */\nexport const recognizeFaceExpressions = (input: TNetInput): Promise => nets.faceExpressionNet.predictExpressions(input);\n\n/**\n * Predicts age and gender from a face image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Predictions with age, gender and gender probability or array thereof in case of batch input.\n */\nexport const predictAgeAndGender = (input: TNetInput): Promise => nets.ageGenderNet.predictAgeAndGender(input);\n\nexport const loadSsdMobilenetv1Model = (url: string) => nets.ssdMobilenetv1.load(url);\nexport const loadTinyFaceDetectorModel = (url: string) => nets.tinyFaceDetector.load(url);\nexport const loadTinyYolov2Model = (url: string) => nets.tinyYolov2.load(url);\nexport const loadFaceLandmarkModel = (url: string) => nets.faceLandmark68Net.load(url);\nexport const loadFaceLandmarkTinyModel = (url: string) => nets.faceLandmark68TinyNet.load(url);\nexport const loadFaceRecognitionModel = (url: string) => nets.faceRecognitionNet.load(url);\nexport const loadFaceExpressionModel = (url: string) => nets.faceExpressionNet.load(url);\nexport const loadAgeGenderModel = (url: string) => nets.ageGenderNet.load(url);\n\n// backward compatibility\nexport const loadFaceDetectionModel = loadSsdMobilenetv1Model;\nexport const locateFaces = ssdMobilenetv1;\nexport const detectLandmarks = detectFaceLandmarks;\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { TNetInput } from '../dom/index';\nimport { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { extendWithFaceExpressions, WithFaceExpressions } from '../factories/WithFaceExpressions';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderTask, PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderTask, PredictSingleAgeAndGenderWithFaceAlignmentTask } from './PredictAgeAndGenderTask';\n\nexport class PredictFaceExpressionsTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected extractedFaces?: Array,\n ) {\n super();\n }\n}\n\nexport class PredictAllFaceExpressionsTask> extends PredictFaceExpressionsTaskBase[], TSource[]> {\n public override async run(): Promise[]> {\n const parentResults = await this.parentTask;\n\n const faceExpressionsByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async (faces) => Promise.all(\n faces.map((face) => nets.faceExpressionNet.predictExpressions(face) as Promise),\n ),\n this.extractedFaces,\n );\n\n return parentResults.map(\n (parentResult, i) => extendWithFaceExpressions(parentResult, faceExpressionsByFace[i]),\n );\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderTask(this, this.input);\n }\n}\n\nexport class PredictSingleFaceExpressionsTask> extends PredictFaceExpressionsTaskBase | undefined, TSource | undefined> {\n public override async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n\n const faceExpressions = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.faceExpressionNet.predictExpressions(face) as Promise,\n this.extractedFaces,\n );\n\n return extendWithFaceExpressions(parentResult, faceExpressions);\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderTask(this, this.input);\n }\n}\n\nexport class PredictAllFaceExpressionsWithFaceAlignmentTask>> extends PredictAllFaceExpressionsTask {\n override withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input);\n }\n}\n\nexport class PredictSingleFaceExpressionsWithFaceAlignmentTask>> extends PredictSingleFaceExpressionsTask {\n override withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { TNetInput } from '../dom/index';\nimport { extendWithAge, WithAge } from '../factories/WithAge';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { extendWithGender, WithGender } from '../factories/WithGender';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport { PredictAllFaceExpressionsTask, PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsTask, PredictSingleFaceExpressionsWithFaceAlignmentTask } from './PredictFaceExpressionsTask';\n\nexport class PredictAgeAndGenderTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected extractedFaces?: Array,\n ) {\n super();\n }\n}\n\nexport class PredictAllAgeAndGenderTask> extends PredictAgeAndGenderTaskBase>[], TSource[]> {\n public override async run(): Promise>[]> {\n const parentResults = await this.parentTask;\n const ageAndGenderByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async (faces) => Promise.all(faces.map((face) => nets.ageGenderNet.predictAgeAndGender(face) as Promise)),\n this.extractedFaces,\n );\n return parentResults.map((parentResult, i) => {\n const { age, gender, genderProbability } = ageAndGenderByFace[i];\n return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age);\n });\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsTask(this, this.input);\n }\n}\n\nexport class PredictSingleAgeAndGenderTask> extends PredictAgeAndGenderTaskBase> | undefined, TSource | undefined> {\n public override async run(): Promise> | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) return undefined;\n const { age, gender, genderProbability } = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.ageGenderNet.predictAgeAndGender(face) as Promise,\n this.extractedFaces,\n );\n return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age);\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsTask(this, this.input);\n }\n}\n\nexport class PredictAllAgeAndGenderWithFaceAlignmentTask>> extends PredictAllAgeAndGenderTask {\n override withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input);\n }\n}\n\nexport class PredictSingleAgeAndGenderWithFaceAlignmentTask>> extends PredictSingleAgeAndGenderTask {\n override withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { TNetInput } from '../dom/index';\nimport { extendWithFaceDescriptor, WithFaceDescriptor } from '../factories/WithFaceDescriptor';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderWithFaceAlignmentTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsWithFaceAlignmentTask } from './PredictFaceExpressionsTask';\n\nexport class ComputeFaceDescriptorsTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n ) {\n super();\n }\n}\n\nexport class ComputeAllFaceDescriptorsTask>> extends ComputeFaceDescriptorsTaskBase[], TSource[]> {\n public override async run(): Promise[]> {\n const parentResults = await this.parentTask;\n const descriptors = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n (faces) => Promise.all(faces.map((face) => nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise)),\n null,\n (parentResult) => parentResult.landmarks.align(null, { useDlibAlignment: true }),\n );\n return descriptors.map((descriptor, i) => extendWithFaceDescriptor(parentResults[i], descriptor));\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n}\n\nexport class ComputeSingleFaceDescriptorTask>> extends ComputeFaceDescriptorsTaskBase | undefined, TSource | undefined> {\n public override async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) return undefined;\n const descriptor = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise,\n null,\n // eslint-disable-next-line no-shadow, @typescript-eslint/no-shadow\n (parentResult) => parentResult.landmarks.align(null, { useDlibAlignment: true }),\n );\n return extendWithFaceDescriptor(parentResult, descriptor);\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom/index';\nimport { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';\nimport { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { extendWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderWithFaceAlignmentTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsWithFaceAlignmentTask } from './PredictFaceExpressionsTask';\n\nexport class DetectFaceLandmarksTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected useTinyLandmarkNet: boolean,\n ) {\n super();\n }\n\n protected get landmarkNet(): FaceLandmark68Net | FaceLandmark68TinyNet {\n return this.useTinyLandmarkNet\n ? nets.faceLandmark68TinyNet\n : nets.faceLandmark68Net;\n }\n}\n\nexport class DetectAllFaceLandmarksTask> extends DetectFaceLandmarksTaskBase[], TSource[]> {\n public override async run(): Promise[]> {\n const parentResults = await this.parentTask;\n const detections = parentResults.map((res) => res.detection);\n const faces: Array = this.input instanceof tf.Tensor\n ? await extractFaceTensors(this.input, detections)\n : await extractFaces(this.input, detections);\n const faceLandmarksByFace = await Promise.all(\n faces.map((face) => this.landmarkNet.detectLandmarks(face)),\n ) as FaceLandmarks68[];\n faces.forEach((f) => f instanceof tf.Tensor && f.dispose());\n return parentResults.map((parentResult, i) => extendWithFaceLandmarks(parentResult, faceLandmarksByFace[i]));\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input);\n }\n}\n\nexport class DetectSingleFaceLandmarksTask> extends DetectFaceLandmarksTaskBase | undefined, TSource | undefined> {\n public override async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n const { detection } = parentResult;\n const faces: Array = this.input instanceof tf.Tensor\n ? await extractFaceTensors(this.input, [detection])\n : await extractFaces(this.input, [detection]);\n const landmarks = await this.landmarkNet.detectLandmarks(faces[0]) as FaceLandmarks68;\n faces.forEach((f) => f instanceof tf.Tensor && f.dispose());\n return extendWithFaceLandmarks(parentResult, landmarks);\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { TNetInput } from '../dom/index';\nimport { extendWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { TinyYolov2Options } from '../tinyYolov2/index';\nimport { ComposableTask } from './ComposableTask';\nimport { DetectAllFaceLandmarksTask, DetectSingleFaceLandmarksTask } from './DetectFaceLandmarksTasks';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderTask, PredictSingleAgeAndGenderTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsTask, PredictSingleFaceExpressionsTask } from './PredictFaceExpressionsTask';\nimport { FaceDetectionOptions } from './types';\n\nexport class DetectFacesTaskBase extends ComposableTask {\n // eslint-disable-next-line no-unused-vars\n constructor(protected input: TNetInput, protected options: FaceDetectionOptions = new SsdMobilenetv1Options()) {\n super();\n }\n}\n\nexport class DetectAllFacesTask extends DetectFacesTaskBase {\n public override async run(): Promise {\n const { input, options } = this;\n let result;\n if (options instanceof TinyFaceDetectorOptions) result = nets.tinyFaceDetector.locateFaces(input, options);\n else if (options instanceof SsdMobilenetv1Options) result = nets.ssdMobilenetv1.locateFaces(input, options);\n else if (options instanceof TinyYolov2Options) result = nets.tinyYolov2.locateFaces(input, options);\n else throw new Error('detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options');\n return result;\n }\n\n private runAndExtendWithFaceDetections(): Promise[]> {\n return new Promise[]>((resolve, reject) => {\n this.run()\n .then((detections) => resolve(detections.map((detection) => extendWithFaceDetection({}, detection))))\n .catch((err) => reject(err));\n });\n }\n\n withFaceLandmarks(useTinyLandmarkNet = false) {\n return new DetectAllFaceLandmarksTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n useTinyLandmarkNet,\n );\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n );\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n );\n }\n}\n\nexport class DetectSingleFaceTask extends DetectFacesTaskBase {\n public override async run(): Promise {\n const faceDetections = await new DetectAllFacesTask(this.input, this.options);\n let faceDetectionWithHighestScore = faceDetections[0];\n faceDetections.forEach((faceDetection) => {\n if (faceDetection.score > faceDetectionWithHighestScore.score) faceDetectionWithHighestScore = faceDetection;\n });\n return faceDetectionWithHighestScore;\n }\n\n private runAndExtendWithFaceDetection(): Promise | undefined> {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise | undefined>(async (resolve) => {\n const detection = await this.run();\n resolve(detection ? extendWithFaceDetection<{}>({}, detection) : undefined);\n });\n }\n\n withFaceLandmarks(useTinyLandmarkNet = false) {\n return new DetectSingleFaceLandmarksTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n useTinyLandmarkNet,\n );\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n );\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n );\n }\n}\n", "import { TNetInput } from '../dom/index';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { DetectAllFacesTask, DetectSingleFaceTask } from './DetectFacesTasks';\nimport { FaceDetectionOptions } from './types';\n\nexport function detectSingleFace(input: TNetInput, options: FaceDetectionOptions = new SsdMobilenetv1Options()): DetectSingleFaceTask {\n return new DetectSingleFaceTask(input, options);\n}\n\nexport function detectAllFaces(input: TNetInput, options: FaceDetectionOptions = new SsdMobilenetv1Options()): DetectAllFacesTask {\n return new DetectAllFacesTask(input, options);\n}\n", "import { TNetInput } from '../dom/index';\nimport { WithFaceDescriptor, WithFaceDetection, WithFaceLandmarks } from '../factories/index';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/index';\nimport { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2/index';\nimport { detectAllFaces } from './detectFaces';\n\nexport async function allFacesSsdMobilenetv1(input: TNetInput, minConfidence?: number): Promise>>[]> {\n return detectAllFaces(input, new SsdMobilenetv1Options(minConfidence ? { minConfidence } : {}))\n .withFaceLandmarks()\n .withFaceDescriptors();\n}\n\nexport async function allFacesTinyYolov2(input: TNetInput, forwardParams: ITinyYolov2Options = {}): Promise>>[]> {\n return detectAllFaces(input, new TinyYolov2Options(forwardParams))\n .withFaceLandmarks()\n .withFaceDescriptors();\n}\n\nexport const allFaces = allFacesSsdMobilenetv1;\n", "export function euclideanDistance(arr1: number[] | Float32Array, arr2: number[] | Float32Array) {\n if (arr1.length !== arr2.length) throw new Error('euclideanDistance: arr1.length !== arr2.length');\n\n const desc1 = Array.from(arr1);\n const desc2 = Array.from(arr2);\n\n return Math.sqrt(\n desc1\n .map((val, i) => val - desc2[i])\n .reduce((res, diff) => res + (diff ** 2), 0),\n );\n}\n", "import { FaceMatch } from '../classes/FaceMatch';\nimport { LabeledFaceDescriptors } from '../classes/LabeledFaceDescriptors';\nimport { euclideanDistance } from '../euclideanDistance';\nimport { WithFaceDescriptor } from '../factories/index';\n\nexport class FaceMatcher {\n private _labeledDescriptors: LabeledFaceDescriptors[]\n\n private _distanceThreshold: number\n\n constructor(\n inputs: LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>,\n distanceThreshold = 0.6,\n ) {\n this._distanceThreshold = distanceThreshold;\n\n const inputArray = Array.isArray(inputs) ? inputs : [inputs];\n\n if (!inputArray.length) {\n throw new Error('FaceRecognizer.constructor - expected atleast one input');\n }\n\n let count = 1;\n const createUniqueLabel = () => `person ${count++}`;\n\n this._labeledDescriptors = inputArray.map((desc) => {\n if (desc instanceof LabeledFaceDescriptors) {\n return desc;\n }\n\n if (desc instanceof Float32Array) {\n return new LabeledFaceDescriptors(createUniqueLabel(), [desc]);\n }\n\n if (desc.descriptor && desc.descriptor instanceof Float32Array) {\n return new LabeledFaceDescriptors(createUniqueLabel(), [desc.descriptor]);\n }\n\n throw new Error('FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>');\n });\n }\n\n public get labeledDescriptors(): LabeledFaceDescriptors[] { return this._labeledDescriptors; }\n\n public get distanceThreshold(): number { return this._distanceThreshold; }\n\n public computeMeanDistance(queryDescriptor: Float32Array, descriptors: Float32Array[]): number {\n return descriptors\n .map((d) => euclideanDistance(d, queryDescriptor))\n .reduce((d1, d2) => d1 + d2, 0)\n / (descriptors.length || 1);\n }\n\n public matchDescriptor(queryDescriptor: Float32Array): FaceMatch {\n return this.labeledDescriptors\n .map(({ descriptors, label }) => new FaceMatch(\n label,\n this.computeMeanDistance(queryDescriptor, descriptors),\n ))\n .reduce((best, curr) => (best.distance < curr.distance ? best : curr));\n }\n\n public findBestMatch(queryDescriptor: Float32Array): FaceMatch {\n const bestMatch = this.matchDescriptor(queryDescriptor);\n return bestMatch.distance < this.distanceThreshold\n ? bestMatch\n : new FaceMatch('unknown', bestMatch.distance);\n }\n\n public toJSON(): any {\n return {\n distanceThreshold: this.distanceThreshold,\n labeledDescriptors: this.labeledDescriptors.map((ld) => ld.toJSON()),\n };\n }\n\n public static fromJSON(json: any): FaceMatcher {\n const labeledDescriptors = json.labeledDescriptors\n .map((ld: any) => LabeledFaceDescriptors.fromJSON(ld));\n return new FaceMatcher(labeledDescriptors, json.distanceThreshold);\n }\n}\n", "import { TinyFaceDetector } from './TinyFaceDetector';\n\nexport * from './TinyFaceDetector';\nexport * from './TinyFaceDetectorOptions';\n\nexport function createTinyFaceDetector(weights: Float32Array) {\n const net = new TinyFaceDetector();\n net.extractWeights(weights);\n return net;\n}\n", "import { Dimensions, IDimensions } from './classes/index';\nimport { FaceDetection } from './classes/FaceDetection';\nimport { FaceLandmarks } from './classes/FaceLandmarks';\nimport { extendWithFaceDetection, isWithFaceDetection } from './factories/WithFaceDetection';\nimport { extendWithFaceLandmarks, isWithFaceLandmarks } from './factories/WithFaceLandmarks';\n\nexport function resizeResults(results: T, dimensions: IDimensions): T {\n const { width, height } = new Dimensions(dimensions.width, dimensions.height);\n\n if (width <= 0 || height <= 0) {\n throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({ width, height })}`);\n }\n\n if (Array.isArray(results)) {\n // return results.map(obj => resizeResults(obj, { width, height })) as any as T\n return (results as Array).map((obj) => resizeResults(obj, { width, height } as IDimensions)) as any as T;\n }\n\n if (isWithFaceLandmarks(results)) {\n const resizedDetection = results.detection.forSize(width, height);\n const resizedLandmarks = results.unshiftedLandmarks.forSize(resizedDetection.box.width, resizedDetection.box.height);\n return extendWithFaceLandmarks(extendWithFaceDetection(results, resizedDetection), resizedLandmarks);\n }\n\n if (isWithFaceDetection(results)) {\n return extendWithFaceDetection(results, results.detection.forSize(width, height));\n }\n\n if (results instanceof FaceLandmarks || results instanceof FaceDetection) {\n return (results as any).forSize(width, height);\n }\n\n return results;\n}\n", "import * as tf from '../dist/tfjs.esm';\nimport * as draw from './draw/index';\nimport * as utils from './utils/index';\nimport * as pkg from '../package.json';\n\nexport { tf, draw, utils };\n\nexport * from './ageGenderNet/index';\nexport * from './classes/index';\nexport * from './dom/index';\nexport * from './env/index';\nexport * from './faceExpressionNet/index';\nexport * from './faceLandmarkNet/index';\nexport * from './faceRecognitionNet/index';\nexport * from './factories/index';\nexport * from './globalApi/index';\nexport * from './ops/index';\nexport * from './ssdMobilenetv1/index';\nexport * from './tinyFaceDetector/index';\nexport * from './tinyYolov2/index';\nexport * from './euclideanDistance';\nexport * from './NeuralNetwork';\nexport * from './resizeResults';\n\nconst node = (typeof process !== 'undefined');\nconst browser = (typeof navigator !== 'undefined') && (typeof navigator.userAgent !== 'undefined');\nexport const version = { faceapi: pkg.version as string, node, browser };\n\n// set webgl defaults\nif (browser) {\n tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n tf.ENV.set('WEBGL_CPU_FORWARD', true);\n tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', false);\n tf.ENV.set('WEBGL_USE_SHAPES_UNIFORMS', true);\n}\n"], - "mappings": "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", - "names": [] -} diff --git a/dist/face-api.js b/dist/face-api.js index 26b867d..f85050f 100644 --- a/dist/face-api.js +++ b/dist/face-api.js @@ -4,43574 +4,61 @@ author: ' */ -(() => { - var __defProp = Object.defineProperty; - var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); - var __require = typeof require !== "undefined" ? require : (x) => { - throw new Error('Dynamic require of "' + x + '" is not supported'); - }; - var __export = (target, all5) => { - __markAsModule(target); - for (var name in all5) - __defProp(target, name, { get: all5[name], enumerable: true }); - }; - - // dist/tfjs.esm.js - var tfjs_esm_exports = {}; - __export(tfjs_esm_exports, { - Abs: () => Abs, - Acos: () => Acos, - Acosh: () => Acosh, - AdadeltaOptimizer: () => AdadeltaOptimizer, - AdagradOptimizer: () => AdagradOptimizer, - AdamOptimizer: () => AdamOptimizer, - AdamaxOptimizer: () => AdamaxOptimizer, - Add: () => Add, - AddN: () => AddN, - All: () => All, - Any: () => Any, - ArgMax: () => ArgMax, - ArgMin: () => ArgMin, - Asin: () => Asin, - Asinh: () => Asinh, - Atan: () => Atan, - Atan2: () => Atan2, - Atanh: () => Atanh, - AvgPool: () => AvgPool, - AvgPool3D: () => AvgPool3D, - AvgPool3DGrad: () => AvgPool3DGrad, - AvgPoolGrad: () => AvgPoolGrad, - BackendWasm: () => BackendWasm, - BatchMatMul: () => BatchMatMul, - BatchToSpaceND: () => BatchToSpaceND, - Bincount: () => Bincount, - BroadcastArgs: () => BroadcastArgs, - BroadcastTo: () => BroadcastTo, - Callback: () => Callback, - CallbackList: () => CallbackList, - Cast: () => Cast, - Ceil: () => Ceil, - ClipByValue: () => ClipByValue, - Complex: () => Complex, - ComplexAbs: () => ComplexAbs, - Concat: () => Concat, - Conv2D: () => Conv2D, - Conv2DBackpropFilter: () => Conv2DBackpropFilter, - Conv2DBackpropInput: () => Conv2DBackpropInput, - Conv3D: () => Conv3D, - Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, - Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, - Cos: () => Cos, - Cosh: () => Cosh, - CropAndResize: () => CropAndResize, - Cumsum: () => Cumsum, - CustomCallback: () => CustomCallback, - DataStorage: () => DataStorage, - DenseBincount: () => DenseBincount, - DepthToSpace: () => DepthToSpace, - DepthwiseConv2dNative: () => DepthwiseConv2dNative, - DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, - DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, - Diag: () => Diag, - Dilation2D: () => Dilation2D, - Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, - Dilation2DBackpropInput: () => Dilation2DBackpropInput, - ENV: () => ENV, - EarlyStopping: () => EarlyStopping, - Einsum: () => Einsum, - Elu: () => Elu, - EluGrad: () => EluGrad, - Environment: () => Environment, - Equal: () => Equal, - Erf: () => Erf, - Exp: () => Exp, - ExpandDims: () => ExpandDims, - Expm1: () => Expm1, - FFT: () => FFT, - Fill: () => Fill, - FlipLeftRight: () => FlipLeftRight, - Floor: () => Floor, - FloorDiv: () => FloorDiv, - FromPixels: () => FromPixels, - FusedBatchNorm: () => FusedBatchNorm, - FusedConv2D: () => FusedConv2D, - FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, - GPGPUContext: () => GPGPUContext, - GatherNd: () => GatherNd, - GatherV2: () => GatherV2, - GraphModel: () => GraphModel, - Greater: () => Greater, - GreaterEqual: () => GreaterEqual, - History: () => History, - IFFT: () => IFFT, - Identity: () => Identity, - Imag: () => Imag, - InputSpec: () => InputSpec, - IsFinite: () => IsFinite, - IsInf: () => IsInf, - IsNan: () => IsNan, - KernelBackend: () => KernelBackend, - LRN: () => LRN, - LRNGrad: () => LRNGrad, - LayerVariable: () => LayerVariable, - LayersModel: () => LayersModel, - LeakyRelu: () => LeakyRelu, - Less: () => Less, - LessEqual: () => LessEqual, - LinSpace: () => LinSpace, - Log: () => Log, - Log1p: () => Log1p, - LogSoftmax: () => LogSoftmax, - LogicalAnd: () => LogicalAnd, - LogicalNot: () => LogicalNot, - LogicalOr: () => LogicalOr, - MathBackendCPU: () => MathBackendCPU, - MathBackendWebGL: () => MathBackendWebGL, - Max: () => Max, - MaxPool: () => MaxPool, - MaxPool3D: () => MaxPool3D, - MaxPool3DGrad: () => MaxPool3DGrad, - MaxPoolGrad: () => MaxPoolGrad, - MaxPoolWithArgmax: () => MaxPoolWithArgmax, - Maximum: () => Maximum, - Mean: () => Mean, - Min: () => Min, - Minimum: () => Minimum, - MirrorPad: () => MirrorPad, - Mod: () => Mod, - MomentumOptimizer: () => MomentumOptimizer, - Multinomial: () => Multinomial, - Multiply: () => Multiply, - Neg: () => Neg, - NonMaxSuppressionV3: () => NonMaxSuppressionV3, - NonMaxSuppressionV4: () => NonMaxSuppressionV4, - NonMaxSuppressionV5: () => NonMaxSuppressionV5, - NotEqual: () => NotEqual, - OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, - OneHot: () => OneHot, - OnesLike: () => OnesLike, - Optimizer: () => Optimizer, - Pack: () => Pack, - PadV2: () => PadV2, - Pool: () => Pool, - Pow: () => Pow, - Prelu: () => Prelu, - Prod: () => Prod, - RMSPropOptimizer: () => RMSPropOptimizer, - RNN: () => RNN, - Range: () => Range, - Rank: () => Rank, - Real: () => Real, - RealDiv: () => RealDiv, - Reciprocal: () => Reciprocal, - Reduction: () => Reduction, - Relu: () => Relu, - Relu6: () => Relu6, - Reshape: () => Reshape, - ResizeBilinear: () => ResizeBilinear, - ResizeBilinearGrad: () => ResizeBilinearGrad, - ResizeNearestNeighbor: () => ResizeNearestNeighbor, - ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, - Reverse: () => Reverse, - RotateWithOffset: () => RotateWithOffset, - Round: () => Round, - Rsqrt: () => Rsqrt, - SGDOptimizer: () => SGDOptimizer, - ScatterNd: () => ScatterNd, - Select: () => Select, - Selu: () => Selu, - Sequential: () => Sequential, - Sigmoid: () => Sigmoid, - Sign: () => Sign, - Sin: () => Sin, - Sinh: () => Sinh, - Slice: () => Slice, - Softmax: () => Softmax, - Softplus: () => Softplus, - SpaceToBatchND: () => SpaceToBatchND, - SparseFillEmptyRows: () => SparseFillEmptyRows, - SparseReshape: () => SparseReshape, - SparseSegmentMean: () => SparseSegmentMean, - SparseSegmentSum: () => SparseSegmentSum, - SparseToDense: () => SparseToDense, - SplitV: () => SplitV, - Sqrt: () => Sqrt, - Square: () => Square, - SquaredDifference: () => SquaredDifference, - Step: () => Step, - StridedSlice: () => StridedSlice, - StringNGrams: () => StringNGrams, - StringSplit: () => StringSplit, - StringToHashBucketFast: () => StringToHashBucketFast, - Sub: () => Sub, - Sum: () => Sum, - SymbolicTensor: () => SymbolicTensor, - Tan: () => Tan, - Tanh: () => Tanh, - Tensor: () => Tensor, - TensorBuffer: () => TensorBuffer, - Tile: () => Tile, - TopK: () => TopK, - Transform: () => Transform, - Transpose: () => Transpose, - Unique: () => Unique, - Unpack: () => Unpack, - UnsortedSegmentSum: () => UnsortedSegmentSum, - Variable: () => Variable, - ZerosLike: () => ZerosLike, - _FusedMatMul: () => _FusedMatMul, - abs: () => abs, - acos: () => acos, - acosh: () => acosh, - add: () => add2, - addN: () => addN, - all: () => all, - any: () => any, - argMax: () => argMax, - argMin: () => argMin, - asin: () => asin, - asinh: () => asinh, - atan: () => atan, - atan2: () => atan2, - atanh: () => atanh, - avgPool: () => avgPool, - avgPool3d: () => avgPool3d, - backend: () => backend, - backend_util: () => backend_util_exports, - basicLSTMCell: () => basicLSTMCell, - batchNorm: () => batchNorm, - batchNorm2d: () => batchNorm2d, - batchNorm3d: () => batchNorm3d, - batchNorm4d: () => batchNorm4d, - batchToSpaceND: () => batchToSpaceND, - bincount: () => bincount, - booleanMaskAsync: () => booleanMaskAsync, - broadcastArgs: () => broadcastArgs, - broadcastTo: () => broadcastTo, - browser: () => browser_exports, - buffer: () => buffer, - callbacks: () => callbacks, - cast: () => cast, - ceil: () => ceil, - clipByValue: () => clipByValue, - clone: () => clone, - complex: () => complex, - concat: () => concat, - concat1d: () => concat1d, - concat2d: () => concat2d, - concat3d: () => concat3d, - concat4d: () => concat4d, - constraints: () => exports_constraints_exports, - conv1d: () => conv1d, - conv2d: () => conv2d, - conv2dTranspose: () => conv2dTranspose, - conv3d: () => conv3d, - conv3dTranspose: () => conv3dTranspose, - copyRegisteredKernels: () => copyRegisteredKernels, - cos: () => cos, - cosh: () => cosh, - cosineWindow: () => cosineWindow, - cumsum: () => cumsum, - customGrad: () => customGrad, - data: () => dist_exports, - denseBincount: () => denseBincount, - deprecationWarn: () => deprecationWarn, - depthToSpace: () => depthToSpace, - depthwiseConv2d: () => depthwiseConv2d, - deregisterOp: () => deregisterOp, - device_util: () => device_util_exports, - diag: () => diag, - dilation2d: () => dilation2d, - disableDeprecationWarnings: () => disableDeprecationWarnings, - dispose: () => dispose, - disposeVariables: () => disposeVariables, - div: () => div, - divNoNan: () => divNoNan, - dot: () => dot, - dropout: () => dropout, - einsum: () => einsum, - elu: () => elu, - enableDebugMode: () => enableDebugMode, - enableProdMode: () => enableProdMode, - enclosingPowerOfTwo: () => enclosingPowerOfTwo, - engine: () => engine, - env: () => env, - equal: () => equal, - erf: () => erf, - exp: () => exp, - expandDims: () => expandDims, - expm1: () => expm1, - eye: () => eye, - fft: () => fft, - fill: () => fill, - findBackend: () => findBackend, - findBackendFactory: () => findBackendFactory, - floor: () => floor, - floorDiv: () => floorDiv, - forceHalfFloat: () => forceHalfFloat, - fused: () => fused_ops_exports, - gather: () => gather, - gatherND: () => gatherND, - gather_util: () => gather_nd_util_exports, - getBackend: () => getBackend, - getGradient: () => getGradient, - getKernel: () => getKernel, - getKernelsForBackend: () => getKernelsForBackend, - gpgpu_util: () => gpgpu_util_exports, - grad: () => grad, - grads: () => grads, - greater: () => greater, - greaterEqual: () => greaterEqual, - ifft: () => ifft, - imag: () => imag, - image: () => image, - inTopKAsync: () => inTopKAsync, - initializers: () => exports_initializers_exports, - input: () => input, - io: () => io_exports, - irfft: () => irfft, - isFinite: () => isFinite2, - isInf: () => isInf, - isNaN: () => isNaN2, - keep: () => keep, - kernel_impls: () => kernel_impls_exports, - layers: () => exports_layers_exports, - leakyRelu: () => leakyRelu, - less: () => less, - lessEqual: () => lessEqual, - linalg: () => linalg, - linspace: () => linspace, - loadGraphModel: () => loadGraphModel, - loadLayersModel: () => loadLayersModel, - localResponseNormalization: () => localResponseNormalization, - log: () => log5, - log1p: () => log1p, - logSigmoid: () => logSigmoid, - logSoftmax: () => logSoftmax, - logSumExp: () => logSumExp, - logicalAnd: () => logicalAnd, - logicalNot: () => logicalNot, - logicalOr: () => logicalOr, - logicalXor: () => logicalXor, - losses: () => losses, - matMul: () => matMul, - math: () => math_exports, - max: () => max, - maxPool: () => maxPool, - maxPool3d: () => maxPool3d, - maxPoolWithArgmax: () => maxPoolWithArgmax, - maximum: () => maximum, - mean: () => mean, - memory: () => memory, - meshgrid: () => meshgrid, - metrics: () => exports_metrics_exports, - min: () => min, - minimum: () => minimum, - mirrorPad: () => mirrorPad, - mod: () => mod, - model: () => model, - models: () => exports_models_exports, - moments: () => moments, - movingAverage: () => movingAverage, - mul: () => mul, - multiRNNCell: () => multiRNNCell, - multinomial: () => multinomial, - neg: () => neg, - nextFrame: () => nextFrame, - norm: () => norm, - notEqual: () => notEqual, - oneHot: () => oneHot, - ones: () => ones2, - onesLike: () => onesLike, - op: () => op, - outerProduct: () => outerProduct, - pad: () => pad, - pad1d: () => pad1d, - pad2d: () => pad2d, - pad3d: () => pad3d, - pad4d: () => pad4d, - pool: () => pool, - pow: () => pow, - prelu: () => prelu, - print: () => print2, - prod: () => prod, - profile: () => profile, - rand: () => rand, - randomGamma: () => randomGamma, - randomNormal: () => randomNormal, - randomUniform: () => randomUniform, - range: () => range, - ready: () => ready, - real: () => real, - reciprocal: () => reciprocal, - registerBackend: () => registerBackend, - registerCallbackConstructor: () => registerCallbackConstructor, - registerGradient: () => registerGradient, - registerKernel: () => registerKernel, - registerOp: () => registerOp, - regularizers: () => exports_regularizers_exports, - relu: () => relu, - relu6: () => relu6, - removeBackend: () => removeBackend, - reshape: () => reshape, - reverse: () => reverse, - reverse1d: () => reverse1d, - reverse2d: () => reverse2d, - reverse3d: () => reverse3d, - reverse4d: () => reverse4d, - rfft: () => rfft, - round: () => round2, - rsqrt: () => rsqrt, - scalar: () => scalar, - scatterND: () => scatterND, - scatter_util: () => scatter_nd_util_exports, - selu: () => selu, - separableConv2d: () => separableConv2d, - sequential: () => sequential, - serialization: () => serialization_exports, - setBackend: () => setBackend, - setPlatform: () => setPlatform, - setWasmPath: () => setWasmPath, - setWasmPaths: () => setWasmPaths, - setWebGLContext: () => setWebGLContext, - setdiff1dAsync: () => setdiff1dAsync, - shared: () => shared_exports, - sigmoid: () => sigmoid, - sign: () => sign, - signal: () => signal, - sin: () => sin, - sinh: () => sinh, - slice: () => slice, - slice1d: () => slice1d, - slice2d: () => slice2d, - slice3d: () => slice3d, - slice4d: () => slice4d, - slice_util: () => slice_util_exports, - softmax: () => softmax, - softplus: () => softplus, - spaceToBatchND: () => spaceToBatchND, - sparse: () => sparse, - sparseToDense: () => sparseToDense, - spectral: () => spectral, - split: () => split, - sqrt: () => sqrt, - square: () => square, - squaredDifference: () => squaredDifference, - squeeze: () => squeeze, - stack: () => stack, - step: () => step, - stridedSlice: () => stridedSlice, - string: () => string, - sub: () => sub, - sum: () => sum2, - sumOutType: () => sumOutType, - tan: () => tan, - tanh: () => tanh2, - tensor: () => tensor, - tensor1d: () => tensor1d, - tensor2d: () => tensor2d, - tensor3d: () => tensor3d, - tensor4d: () => tensor4d, - tensor5d: () => tensor5d, - tensor6d: () => tensor6d, - tensor_util: () => tensor_util_exports, - test_util: () => test_util_exports, - tidy: () => tidy, - tile: () => tile, - time: () => time, - topk: () => topk, - train: () => train, - transpose: () => transpose, - truncatedNormal: () => truncatedNormal, - unique: () => unique, - unregisterGradient: () => unregisterGradient, - unregisterKernel: () => unregisterKernel, - unsortedSegmentSum: () => unsortedSegmentSum, - unstack: () => unstack, - upcastType: () => upcastType, - util: () => util_exports, - valueAndGrad: () => valueAndGrad, - valueAndGrads: () => valueAndGrads, - variable: () => variable, - variableGrads: () => variableGrads, - version: () => version16, - version_converter: () => version11, - version_core: () => version9, - version_cpu: () => version13, - version_layers: () => version10, - version_wasm: () => version15, - version_webgl: () => version14, - webgl: () => webgl, - webgl_util: () => webgl_util_exports, - where: () => where, - whereAsync: () => whereAsync, - zeros: () => zeros, - zerosLike: () => zerosLike - }); - var __create = Object.create; - var __defProp2 = Object.defineProperty; - var __getOwnPropDesc = Object.getOwnPropertyDescriptor; - var __getOwnPropNames = Object.getOwnPropertyNames; - var __getProtoOf = Object.getPrototypeOf; - var __hasOwnProp = Object.prototype.hasOwnProperty; - var __markAsModule2 = (target) => __defProp2(target, "__esModule", { value: true }); - var __require2 = typeof __require !== "undefined" ? __require : (x) => { - throw new Error('Dynamic require of "' + x + '" is not supported'); - }; - var __commonJS = (cb, mod4) => function __require22() { - return mod4 || (0, cb[Object.keys(cb)[0]])((mod4 = { exports: {} }).exports, mod4), mod4.exports; - }; - var __export2 = (target, all5) => { - __markAsModule2(target); - for (var name in all5) - __defProp2(target, name, { get: all5[name], enumerable: true }); - }; - var __reExport = (target, module2, desc) => { - if (module2 && typeof module2 === "object" || typeof module2 === "function") { - for (let key of __getOwnPropNames(module2)) - if (!__hasOwnProp.call(target, key) && key !== "default") - __defProp2(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); - } - return target; - }; - var __toModule = (module2) => { - return __reExport(__markAsModule2(__defProp2(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); - }; - var require_long = __commonJS({ - "node_modules/.pnpm/long@4.0.0/node_modules/long/src/long.js"(exports, module2) { - module2.exports = Long2; - var wasm = null; - try { - wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([ - 0, - 97, - 115, - 109, - 1, - 0, - 0, - 0, - 1, - 13, - 2, - 96, - 0, - 1, - 127, - 96, - 4, - 127, - 127, - 127, - 127, - 1, - 127, - 3, - 7, - 6, - 0, - 1, - 1, - 1, - 1, - 1, - 6, - 6, - 1, - 127, - 1, - 65, - 0, - 11, - 7, - 50, - 6, - 3, - 109, - 117, - 108, - 0, - 1, - 5, - 100, - 105, - 118, - 95, - 115, - 0, - 2, - 5, - 100, - 105, - 118, - 95, - 117, - 0, - 3, - 5, - 114, - 101, - 109, - 95, - 115, - 0, - 4, - 5, - 114, - 101, - 109, - 95, - 117, - 0, - 5, - 8, - 103, - 101, - 116, - 95, - 104, - 105, - 103, - 104, - 0, - 0, - 10, - 191, - 1, - 6, - 4, - 0, - 35, - 0, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 126, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 127, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 128, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 129, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 130, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11 - ])), {}).exports; - } catch (e) { - } - function Long2(low, high, unsigned) { - this.low = low | 0; - this.high = high | 0; - this.unsigned = !!unsigned; - } - Long2.prototype.__isLong__; - Object.defineProperty(Long2.prototype, "__isLong__", { value: true }); - function isLong(obj) { - return (obj && obj["__isLong__"]) === true; - } - Long2.isLong = isLong; - var INT_CACHE = {}; - var UINT_CACHE = {}; - function fromInt(value, unsigned) { - var obj, cachedObj, cache; - if (unsigned) { - value >>>= 0; - if (cache = 0 <= value && value < 256) { - cachedObj = UINT_CACHE[value]; - if (cachedObj) - return cachedObj; - } - obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true); - if (cache) - UINT_CACHE[value] = obj; - return obj; - } else { - value |= 0; - if (cache = -128 <= value && value < 128) { - cachedObj = INT_CACHE[value]; - if (cachedObj) - return cachedObj; - } - obj = fromBits(value, value < 0 ? -1 : 0, false); - if (cache) - INT_CACHE[value] = obj; - return obj; - } - } - Long2.fromInt = fromInt; - function fromNumber(value, unsigned) { - if (isNaN(value)) - return unsigned ? UZERO : ZERO; - if (unsigned) { - if (value < 0) - return UZERO; - if (value >= TWO_PWR_64_DBL) - return MAX_UNSIGNED_VALUE; - } else { - if (value <= -TWO_PWR_63_DBL) - return MIN_VALUE; - if (value + 1 >= TWO_PWR_63_DBL) - return MAX_VALUE; - } - if (value < 0) - return fromNumber(-value, unsigned).neg(); - return fromBits(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0, unsigned); - } - Long2.fromNumber = fromNumber; - function fromBits(lowBits, highBits, unsigned) { - return new Long2(lowBits, highBits, unsigned); - } - Long2.fromBits = fromBits; - var pow_dbl = Math.pow; - function fromString(str, unsigned, radix) { - if (str.length === 0) - throw Error("empty string"); - if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") - return ZERO; - if (typeof unsigned === "number") { - radix = unsigned, unsigned = false; - } else { - unsigned = !!unsigned; - } - radix = radix || 10; - if (radix < 2 || 36 < radix) - throw RangeError("radix"); - var p2; - if ((p2 = str.indexOf("-")) > 0) - throw Error("interior hyphen"); - else if (p2 === 0) { - return fromString(str.substring(1), unsigned, radix).neg(); - } - var radixToPower = fromNumber(pow_dbl(radix, 8)); - var result = ZERO; - for (var i = 0; i < str.length; i += 8) { - var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = fromNumber(pow_dbl(radix, size)); - result = result.mul(power).add(fromNumber(value)); - } else { - result = result.mul(radixToPower); - result = result.add(fromNumber(value)); - } - } - result.unsigned = unsigned; - return result; - } - Long2.fromString = fromString; - function fromValue(val, unsigned) { - if (typeof val === "number") - return fromNumber(val, unsigned); - if (typeof val === "string") - return fromString(val, unsigned); - return fromBits(val.low, val.high, typeof unsigned === "boolean" ? unsigned : val.unsigned); - } - Long2.fromValue = fromValue; - var TWO_PWR_16_DBL = 1 << 16; - var TWO_PWR_24_DBL = 1 << 24; - var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; - var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; - var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; - var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL); - var ZERO = fromInt(0); - Long2.ZERO = ZERO; - var UZERO = fromInt(0, true); - Long2.UZERO = UZERO; - var ONE = fromInt(1); - Long2.ONE = ONE; - var UONE = fromInt(1, true); - Long2.UONE = UONE; - var NEG_ONE = fromInt(-1); - Long2.NEG_ONE = NEG_ONE; - var MAX_VALUE = fromBits(4294967295 | 0, 2147483647 | 0, false); - Long2.MAX_VALUE = MAX_VALUE; - var MAX_UNSIGNED_VALUE = fromBits(4294967295 | 0, 4294967295 | 0, true); - Long2.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE; - var MIN_VALUE = fromBits(0, 2147483648 | 0, false); - Long2.MIN_VALUE = MIN_VALUE; - var LongPrototype = Long2.prototype; - LongPrototype.toInt = function toInt() { - return this.unsigned ? this.low >>> 0 : this.low; - }; - LongPrototype.toNumber = function toNumber() { - if (this.unsigned) - return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); - return this.high * TWO_PWR_32_DBL + (this.low >>> 0); - }; - LongPrototype.toString = function toString(radix) { - radix = radix || 10; - if (radix < 2 || 36 < radix) - throw RangeError("radix"); - if (this.isZero()) - return "0"; - if (this.isNegative()) { - if (this.eq(MIN_VALUE)) { - var radixLong = fromNumber(radix), div3 = this.div(radixLong), rem1 = div3.mul(radixLong).sub(this); - return div3.toString(radix) + rem1.toInt().toString(radix); - } else - return "-" + this.neg().toString(radix); - } - var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), rem = this; - var result = ""; - while (true) { - var remDiv = rem.div(radixToPower), intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, digits = intval.toString(radix); - rem = remDiv; - if (rem.isZero()) - return digits + result; - else { - while (digits.length < 6) - digits = "0" + digits; - result = "" + digits + result; - } - } - }; - LongPrototype.getHighBits = function getHighBits() { - return this.high; - }; - LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() { - return this.high >>> 0; - }; - LongPrototype.getLowBits = function getLowBits() { - return this.low; - }; - LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() { - return this.low >>> 0; - }; - LongPrototype.getNumBitsAbs = function getNumBitsAbs() { - if (this.isNegative()) - return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); - var val = this.high != 0 ? this.high : this.low; - for (var bit = 31; bit > 0; bit--) - if ((val & 1 << bit) != 0) - break; - return this.high != 0 ? bit + 33 : bit + 1; - }; - LongPrototype.isZero = function isZero() { - return this.high === 0 && this.low === 0; - }; - LongPrototype.eqz = LongPrototype.isZero; - LongPrototype.isNegative = function isNegative() { - return !this.unsigned && this.high < 0; - }; - LongPrototype.isPositive = function isPositive() { - return this.unsigned || this.high >= 0; - }; - LongPrototype.isOdd = function isOdd() { - return (this.low & 1) === 1; - }; - LongPrototype.isEven = function isEven22() { - return (this.low & 1) === 0; - }; - LongPrototype.equals = function equals(other) { - if (!isLong(other)) - other = fromValue(other); - if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) - return false; - return this.high === other.high && this.low === other.low; - }; - LongPrototype.eq = LongPrototype.equals; - LongPrototype.notEquals = function notEquals(other) { - return !this.eq(other); - }; - LongPrototype.neq = LongPrototype.notEquals; - LongPrototype.ne = LongPrototype.notEquals; - LongPrototype.lessThan = function lessThan(other) { - return this.comp(other) < 0; - }; - LongPrototype.lt = LongPrototype.lessThan; - LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) { - return this.comp(other) <= 0; - }; - LongPrototype.lte = LongPrototype.lessThanOrEqual; - LongPrototype.le = LongPrototype.lessThanOrEqual; - LongPrototype.greaterThan = function greaterThan(other) { - return this.comp(other) > 0; - }; - LongPrototype.gt = LongPrototype.greaterThan; - LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) { - return this.comp(other) >= 0; - }; - LongPrototype.gte = LongPrototype.greaterThanOrEqual; - LongPrototype.ge = LongPrototype.greaterThanOrEqual; - LongPrototype.compare = function compare(other) { - if (!isLong(other)) - other = fromValue(other); - if (this.eq(other)) - return 0; - var thisNeg = this.isNegative(), otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) - return -1; - if (!thisNeg && otherNeg) - return 1; - if (!this.unsigned) - return this.sub(other).isNegative() ? -1 : 1; - return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1; - }; - LongPrototype.comp = LongPrototype.compare; - LongPrototype.negate = function negate() { - if (!this.unsigned && this.eq(MIN_VALUE)) - return MIN_VALUE; - return this.not().add(ONE); - }; - LongPrototype.neg = LongPrototype.negate; - LongPrototype.add = function add5(addend) { - if (!isLong(addend)) - addend = fromValue(addend); - var a48 = this.high >>> 16; - var a32 = this.high & 65535; - var a16 = this.low >>> 16; - var a00 = this.low & 65535; - var b48 = addend.high >>> 16; - var b32 = addend.high & 65535; - var b16 = addend.low >>> 16; - var b00 = addend.low & 65535; - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 65535; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 65535; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 65535; - c48 += a48 + b48; - c48 &= 65535; - return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); - }; - LongPrototype.subtract = function subtract(subtrahend) { - if (!isLong(subtrahend)) - subtrahend = fromValue(subtrahend); - return this.add(subtrahend.neg()); - }; - LongPrototype.sub = LongPrototype.subtract; - LongPrototype.multiply = function multiply4(multiplier) { - if (this.isZero()) - return ZERO; - if (!isLong(multiplier)) - multiplier = fromValue(multiplier); - if (wasm) { - var low = wasm.mul(this.low, this.high, multiplier.low, multiplier.high); - return fromBits(low, wasm.get_high(), this.unsigned); - } - if (multiplier.isZero()) - return ZERO; - if (this.eq(MIN_VALUE)) - return multiplier.isOdd() ? MIN_VALUE : ZERO; - if (multiplier.eq(MIN_VALUE)) - return this.isOdd() ? MIN_VALUE : ZERO; - if (this.isNegative()) { - if (multiplier.isNegative()) - return this.neg().mul(multiplier.neg()); - else - return this.neg().mul(multiplier).neg(); - } else if (multiplier.isNegative()) - return this.mul(multiplier.neg()).neg(); - if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24)) - return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); - var a48 = this.high >>> 16; - var a32 = this.high & 65535; - var a16 = this.low >>> 16; - var a00 = this.low & 65535; - var b48 = multiplier.high >>> 16; - var b32 = multiplier.high & 65535; - var b16 = multiplier.low >>> 16; - var b00 = multiplier.low & 65535; - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 65535; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 65535; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 65535; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 65535; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 65535; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 65535; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 65535; - return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); - }; - LongPrototype.mul = LongPrototype.multiply; - LongPrototype.divide = function divide(divisor) { - if (!isLong(divisor)) - divisor = fromValue(divisor); - if (divisor.isZero()) - throw Error("division by zero"); - if (wasm) { - if (!this.unsigned && this.high === -2147483648 && divisor.low === -1 && divisor.high === -1) { - return this; - } - var low = (this.unsigned ? wasm.div_u : wasm.div_s)(this.low, this.high, divisor.low, divisor.high); - return fromBits(low, wasm.get_high(), this.unsigned); - } - if (this.isZero()) - return this.unsigned ? UZERO : ZERO; - var approx, rem, res; - if (!this.unsigned) { - if (this.eq(MIN_VALUE)) { - if (divisor.eq(ONE) || divisor.eq(NEG_ONE)) - return MIN_VALUE; - else if (divisor.eq(MIN_VALUE)) - return ONE; - else { - var halfThis = this.shr(1); - approx = halfThis.div(divisor).shl(1); - if (approx.eq(ZERO)) { - return divisor.isNegative() ? ONE : NEG_ONE; - } else { - rem = this.sub(divisor.mul(approx)); - res = approx.add(rem.div(divisor)); - return res; - } - } - } else if (divisor.eq(MIN_VALUE)) - return this.unsigned ? UZERO : ZERO; - if (this.isNegative()) { - if (divisor.isNegative()) - return this.neg().div(divisor.neg()); - return this.neg().div(divisor).neg(); - } else if (divisor.isNegative()) - return this.div(divisor.neg()).neg(); - res = ZERO; - } else { - if (!divisor.unsigned) - divisor = divisor.toUnsigned(); - if (divisor.gt(this)) - return UZERO; - if (divisor.gt(this.shru(1))) - return UONE; - res = UZERO; - } - rem = this; - while (rem.gte(divisor)) { - approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); - var log22 = Math.ceil(Math.log(approx) / Math.LN2), delta = log22 <= 48 ? 1 : pow_dbl(2, log22 - 48), approxRes = fromNumber(approx), approxRem = approxRes.mul(divisor); - while (approxRem.isNegative() || approxRem.gt(rem)) { - approx -= delta; - approxRes = fromNumber(approx, this.unsigned); - approxRem = approxRes.mul(divisor); - } - if (approxRes.isZero()) - approxRes = ONE; - res = res.add(approxRes); - rem = rem.sub(approxRem); - } - return res; - }; - LongPrototype.div = LongPrototype.divide; - LongPrototype.modulo = function modulo(divisor) { - if (!isLong(divisor)) - divisor = fromValue(divisor); - if (wasm) { - var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(this.low, this.high, divisor.low, divisor.high); - return fromBits(low, wasm.get_high(), this.unsigned); - } - return this.sub(this.div(divisor).mul(divisor)); - }; - LongPrototype.mod = LongPrototype.modulo; - LongPrototype.rem = LongPrototype.modulo; - LongPrototype.not = function not() { - return fromBits(~this.low, ~this.high, this.unsigned); - }; - LongPrototype.and = function and(other) { - if (!isLong(other)) - other = fromValue(other); - return fromBits(this.low & other.low, this.high & other.high, this.unsigned); - }; - LongPrototype.or = function or(other) { - if (!isLong(other)) - other = fromValue(other); - return fromBits(this.low | other.low, this.high | other.high, this.unsigned); - }; - LongPrototype.xor = function xor(other) { - if (!isLong(other)) - other = fromValue(other); - return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); - }; - LongPrototype.shiftLeft = function shiftLeft(numBits) { - if (isLong(numBits)) - numBits = numBits.toInt(); - if ((numBits &= 63) === 0) - return this; - else if (numBits < 32) - return fromBits(this.low << numBits, this.high << numBits | this.low >>> 32 - numBits, this.unsigned); - else - return fromBits(0, this.low << numBits - 32, this.unsigned); - }; - LongPrototype.shl = LongPrototype.shiftLeft; - LongPrototype.shiftRight = function shiftRight(numBits) { - if (isLong(numBits)) - numBits = numBits.toInt(); - if ((numBits &= 63) === 0) - return this; - else if (numBits < 32) - return fromBits(this.low >>> numBits | this.high << 32 - numBits, this.high >> numBits, this.unsigned); - else - return fromBits(this.high >> numBits - 32, this.high >= 0 ? 0 : -1, this.unsigned); - }; - LongPrototype.shr = LongPrototype.shiftRight; - LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) { - if (isLong(numBits)) - numBits = numBits.toInt(); - numBits &= 63; - if (numBits === 0) - return this; - else { - var high = this.high; - if (numBits < 32) { - var low = this.low; - return fromBits(low >>> numBits | high << 32 - numBits, high >>> numBits, this.unsigned); - } else if (numBits === 32) - return fromBits(high, 0, this.unsigned); - else - return fromBits(high >>> numBits - 32, 0, this.unsigned); - } - }; - LongPrototype.shru = LongPrototype.shiftRightUnsigned; - LongPrototype.shr_u = LongPrototype.shiftRightUnsigned; - LongPrototype.toSigned = function toSigned() { - if (!this.unsigned) - return this; - return fromBits(this.low, this.high, false); - }; - LongPrototype.toUnsigned = function toUnsigned() { - if (this.unsigned) - return this; - return fromBits(this.low, this.high, true); - }; - LongPrototype.toBytes = function toBytes(le) { - return le ? this.toBytesLE() : this.toBytesBE(); - }; - LongPrototype.toBytesLE = function toBytesLE() { - var hi = this.high, lo = this.low; - return [ - lo & 255, - lo >>> 8 & 255, - lo >>> 16 & 255, - lo >>> 24, - hi & 255, - hi >>> 8 & 255, - hi >>> 16 & 255, - hi >>> 24 - ]; - }; - LongPrototype.toBytesBE = function toBytesBE() { - var hi = this.high, lo = this.low; - return [ - hi >>> 24, - hi >>> 16 & 255, - hi >>> 8 & 255, - hi & 255, - lo >>> 24, - lo >>> 16 & 255, - lo >>> 8 & 255, - lo & 255 - ]; - }; - Long2.fromBytes = function fromBytes(bytes, unsigned, le) { - return le ? Long2.fromBytesLE(bytes, unsigned) : Long2.fromBytesBE(bytes, unsigned); - }; - Long2.fromBytesLE = function fromBytesLE(bytes, unsigned) { - return new Long2(bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24, bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24, unsigned); - }; - Long2.fromBytesBE = function fromBytesBE(bytes, unsigned) { - return new Long2(bytes[4] << 24 | bytes[5] << 16 | bytes[6] << 8 | bytes[7], bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], unsigned); - }; - } - }); - var require_browser = __commonJS({ - "(disabled):node_modules/.pnpm/node-fetch@2.6.2/node_modules/node-fetch/browser.js"() { - } - }); - var require_alea = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/alea.js"(exports, module2) { - (function(global2, module22, define2) { - function Alea(seed) { - var me = this, mash = Mash(); - me.next = function() { - var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; - me.s0 = me.s1; - me.s1 = me.s2; - return me.s2 = t - (me.c = t | 0); - }; - me.c = 1; - me.s0 = mash(" "); - me.s1 = mash(" "); - me.s2 = mash(" "); - me.s0 -= mash(seed); - if (me.s0 < 0) { - me.s0 += 1; - } - me.s1 -= mash(seed); - if (me.s1 < 0) { - me.s1 += 1; - } - me.s2 -= mash(seed); - if (me.s2 < 0) { - me.s2 += 1; - } - mash = null; - } - function copy(f, t) { - t.c = f.c; - t.s0 = f.s0; - t.s1 = f.s1; - t.s2 = f.s2; - return t; - } - function impl(seed, opts) { - var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; - prng.int32 = function() { - return xg.next() * 4294967296 | 0; - }; - prng.double = function() { - return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; - }; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - function Mash() { - var n = 4022871197; - var mash = function(data) { - data = data.toString(); - for (var i = 0; i < data.length; i++) { - n += data.charCodeAt(i); - var h = 0.02519603282416938 * n; - n = h >>> 0; - h -= n; - h *= n; - n = h >>> 0; - h -= n; - n += h * 4294967296; - } - return (n >>> 0) * 23283064365386963e-26; - }; - return mash; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.alea = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_xor128 = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor128.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - me.next = function() { - var t = me.x ^ me.x << 11; - me.x = me.y; - me.y = me.z; - me.z = me.w; - return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; - }; - if (seed === (seed | 0)) { - me.x = seed; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - me.next(); - } - } - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - return t; - } - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xor128 = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_xorwow = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorwow.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.next = function() { - var t = me.x ^ me.x >>> 2; - me.x = me.y; - me.y = me.z; - me.z = me.w; - me.w = me.v; - return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; - }; - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - me.v = 0; - if (seed === (seed | 0)) { - me.x = seed; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - if (k == strseed.length) { - me.d = me.x << 10 ^ me.x >>> 4; - } - me.next(); - } - } - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - t.v = f.v; - t.d = f.d; - return t; - } - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xorwow = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_xorshift7 = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorshift7.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this; - me.next = function() { - var X = me.x, i = me.i, t, v, w; - t = X[i]; - t ^= t >>> 7; - v = t ^ t << 24; - t = X[i + 1 & 7]; - v ^= t ^ t >>> 10; - t = X[i + 3 & 7]; - v ^= t ^ t >>> 3; - t = X[i + 4 & 7]; - v ^= t ^ t << 7; - t = X[i + 7 & 7]; - t = t ^ t << 13; - v ^= t ^ t << 9; - X[i] = v; - me.i = i + 1 & 7; - return v; - }; - function init2(me2, seed2) { - var j, w, X = []; - if (seed2 === (seed2 | 0)) { - w = X[0] = seed2; - } else { - seed2 = "" + seed2; - for (j = 0; j < seed2.length; ++j) { - X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; - } - } - while (X.length < 8) - X.push(0); - for (j = 0; j < 8 && X[j] === 0; ++j) - ; - if (j == 8) - w = X[7] = -1; - else - w = X[j]; - me2.x = X; - me2.i = 0; - for (j = 256; j > 0; --j) { - me2.next(); - } - } - init2(me, seed); - } - function copy(f, t) { - t.x = f.x.slice(); - t.i = f.i; - return t; - } - function impl(seed, opts) { - if (seed == null) - seed = +new Date(); - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.x) - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xorshift7 = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_xor4096 = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor4096.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this; - me.next = function() { - var w = me.w, X = me.X, i = me.i, t, v; - me.w = w = w + 1640531527 | 0; - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - v = X[i] = v ^ t; - me.i = i; - return v + (w ^ w >>> 16) | 0; - }; - function init2(me2, seed2) { - var t, v, i, j, w, X = [], limit = 128; - if (seed2 === (seed2 | 0)) { - v = seed2; - seed2 = null; - } else { - seed2 = seed2 + "\0"; - v = 0; - limit = Math.max(limit, seed2.length); - } - for (i = 0, j = -32; j < limit; ++j) { - if (seed2) - v ^= seed2.charCodeAt((j + 32) % seed2.length); - if (j === 0) - w = v; - v ^= v << 10; - v ^= v >>> 15; - v ^= v << 4; - v ^= v >>> 13; - if (j >= 0) { - w = w + 1640531527 | 0; - t = X[j & 127] ^= v + w; - i = t == 0 ? i + 1 : 0; - } - } - if (i >= 128) { - X[(seed2 && seed2.length || 0) & 127] = -1; - } - i = 127; - for (j = 4 * 128; j > 0; --j) { - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - X[i] = v ^ t; - } - me2.w = w; - me2.X = X; - me2.i = i; - } - init2(me, seed); - } - function copy(f, t) { - t.i = f.i; - t.w = f.w; - t.X = f.X.slice(); - return t; - } - ; - function impl(seed, opts) { - if (seed == null) - seed = +new Date(); - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.X) - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xor4096 = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_tychei = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/tychei.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.next = function() { - var b = me.b, c = me.c, d = me.d, a = me.a; - b = b << 25 ^ b >>> 7 ^ c; - c = c - d | 0; - d = d << 24 ^ d >>> 8 ^ a; - a = a - b | 0; - me.b = b = b << 20 ^ b >>> 12 ^ c; - me.c = c = c - d | 0; - me.d = d << 16 ^ c >>> 16 ^ a; - return me.a = a - b | 0; - }; - me.a = 0; - me.b = 0; - me.c = 2654435769 | 0; - me.d = 1367130551; - if (seed === Math.floor(seed)) { - me.a = seed / 4294967296 | 0; - me.b = seed | 0; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 20; k++) { - me.b ^= strseed.charCodeAt(k) | 0; - me.next(); - } - } - function copy(f, t) { - t.a = f.a; - t.b = f.b; - t.c = f.c; - t.d = f.d; - return t; - } - ; - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.tychei = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_crypto = __commonJS({ - "(disabled):crypto"() { - } - }); - var require_seedrandom = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/seedrandom.js"(exports, module2) { - (function(pool3, math) { - var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; - function seedrandom5(seed, options, callback) { - var key = []; - options = options == true ? { entropy: true } : options || {}; - var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); - var arc4 = new ARC4(key); - var prng = function() { - var n = arc4.g(chunks), d = startdenom, x = 0; - while (n < significance) { - n = (n + x) * width; - d *= width; - x = arc4.g(1); - } - while (n >= overflow) { - n /= 2; - d /= 2; - x >>>= 1; - } - return (n + x) / d; - }; - prng.int32 = function() { - return arc4.g(4) | 0; - }; - prng.quick = function() { - return arc4.g(4) / 4294967296; - }; - prng.double = prng; - mixkey(tostring(arc4.S), pool3); - return (options.pass || callback || function(prng2, seed2, is_math_call, state) { - if (state) { - if (state.S) { - copy(state, arc4); - } - prng2.state = function() { - return copy(arc4, {}); - }; - } - if (is_math_call) { - math[rngname] = prng2; - return seed2; - } else - return prng2; - })(prng, shortseed, "global" in options ? options.global : this == math, options.state); - } - math["seed" + rngname] = seedrandom5; - function ARC4(key) { - var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; - if (!keylen) { - key = [keylen++]; - } - while (i < width) { - s[i] = i++; - } - for (i = 0; i < width; i++) { - s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; - s[j] = t; - } - (me.g = function(count2) { - var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; - while (count2--) { - t2 = s2[i2 = mask & i2 + 1]; - r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; - } - me.i = i2; - me.j = j2; - return r; - })(width); - } - function copy(f, t) { - t.i = f.i; - t.j = f.j; - t.S = f.S.slice(); - return t; - } - ; - function flatten4(obj, depth) { - var result = [], typ = typeof obj, prop; - if (depth && typ == "object") { - for (prop in obj) { - try { - result.push(flatten4(obj[prop], depth - 1)); - } catch (e) { - } - } - } - return result.length ? result : typ == "string" ? obj : obj + "\0"; - } - function mixkey(seed, key) { - var stringseed = seed + "", smear, j = 0; - while (j < stringseed.length) { - key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); - } - return tostring(key); - } - function autoseed() { - try { - var out; - if (nodecrypto && (out = nodecrypto.randomBytes)) { - out = out(width); - } else { - out = new Uint8Array(width); - (global2.crypto || global2.msCrypto).getRandomValues(out); - } - return tostring(out); - } catch (e) { - var browser2 = global2.navigator, plugins = browser2 && browser2.plugins; - return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; - } - } - function tostring(a) { - return String.fromCharCode.apply(0, a); - } - mixkey(math.random(), pool3); - if (typeof module2 == "object" && module2.exports) { - module2.exports = seedrandom5; - try { - nodecrypto = require_crypto(); - } catch (ex) { - } - } else if (typeof define == "function" && define.amd) { - define(function() { - return seedrandom5; - }); - } - })([], Math); - } - }); - var require_seedrandom2 = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/index.js"(exports, module2) { - var alea5 = require_alea(); - var xor128 = require_xor128(); - var xorwow = require_xorwow(); - var xorshift7 = require_xorshift7(); - var xor4096 = require_xor4096(); - var tychei = require_tychei(); - var sr = require_seedrandom(); - sr.alea = alea5; - sr.xor128 = xor128; - sr.xorwow = xorwow; - sr.xorshift7 = xorshift7; - sr.xor4096 = xor4096; - sr.tychei = tychei; - module2.exports = sr; - } - }); - var require_alea2 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/alea.js"(exports, module2) { - (function(global2, module22, define2) { - function Alea(seed) { - var me = this, mash = Mash(); - me.next = function() { - var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; - me.s0 = me.s1; - me.s1 = me.s2; - return me.s2 = t - (me.c = t | 0); - }; - me.c = 1; - me.s0 = mash(" "); - me.s1 = mash(" "); - me.s2 = mash(" "); - me.s0 -= mash(seed); - if (me.s0 < 0) { - me.s0 += 1; - } - me.s1 -= mash(seed); - if (me.s1 < 0) { - me.s1 += 1; - } - me.s2 -= mash(seed); - if (me.s2 < 0) { - me.s2 += 1; - } - mash = null; - } - function copy(f, t) { - t.c = f.c; - t.s0 = f.s0; - t.s1 = f.s1; - t.s2 = f.s2; - return t; - } - function impl(seed, opts) { - var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; - prng.int32 = function() { - return xg.next() * 4294967296 | 0; - }; - prng.double = function() { - return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; - }; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - function Mash() { - var n = 4022871197; - var mash = function(data) { - data = String(data); - for (var i = 0; i < data.length; i++) { - n += data.charCodeAt(i); - var h = 0.02519603282416938 * n; - n = h >>> 0; - h -= n; - h *= n; - n = h >>> 0; - h -= n; - n += h * 4294967296; - } - return (n >>> 0) * 23283064365386963e-26; - }; - return mash; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.alea = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_xor1282 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor128.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - me.next = function() { - var t = me.x ^ me.x << 11; - me.x = me.y; - me.y = me.z; - me.z = me.w; - return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; - }; - if (seed === (seed | 0)) { - me.x = seed; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - me.next(); - } - } - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - return t; - } - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xor128 = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_xorwow2 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorwow.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.next = function() { - var t = me.x ^ me.x >>> 2; - me.x = me.y; - me.y = me.z; - me.z = me.w; - me.w = me.v; - return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; - }; - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - me.v = 0; - if (seed === (seed | 0)) { - me.x = seed; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - if (k == strseed.length) { - me.d = me.x << 10 ^ me.x >>> 4; - } - me.next(); - } - } - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - t.v = f.v; - t.d = f.d; - return t; - } - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xorwow = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_xorshift72 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorshift7.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this; - me.next = function() { - var X = me.x, i = me.i, t, v, w; - t = X[i]; - t ^= t >>> 7; - v = t ^ t << 24; - t = X[i + 1 & 7]; - v ^= t ^ t >>> 10; - t = X[i + 3 & 7]; - v ^= t ^ t >>> 3; - t = X[i + 4 & 7]; - v ^= t ^ t << 7; - t = X[i + 7 & 7]; - t = t ^ t << 13; - v ^= t ^ t << 9; - X[i] = v; - me.i = i + 1 & 7; - return v; - }; - function init2(me2, seed2) { - var j, w, X = []; - if (seed2 === (seed2 | 0)) { - w = X[0] = seed2; - } else { - seed2 = "" + seed2; - for (j = 0; j < seed2.length; ++j) { - X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; - } - } - while (X.length < 8) - X.push(0); - for (j = 0; j < 8 && X[j] === 0; ++j) - ; - if (j == 8) - w = X[7] = -1; - else - w = X[j]; - me2.x = X; - me2.i = 0; - for (j = 256; j > 0; --j) { - me2.next(); - } - } - init2(me, seed); - } - function copy(f, t) { - t.x = f.x.slice(); - t.i = f.i; - return t; - } - function impl(seed, opts) { - if (seed == null) - seed = +new Date(); - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.x) - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xorshift7 = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_xor40962 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor4096.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this; - me.next = function() { - var w = me.w, X = me.X, i = me.i, t, v; - me.w = w = w + 1640531527 | 0; - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - v = X[i] = v ^ t; - me.i = i; - return v + (w ^ w >>> 16) | 0; - }; - function init2(me2, seed2) { - var t, v, i, j, w, X = [], limit = 128; - if (seed2 === (seed2 | 0)) { - v = seed2; - seed2 = null; - } else { - seed2 = seed2 + "\0"; - v = 0; - limit = Math.max(limit, seed2.length); - } - for (i = 0, j = -32; j < limit; ++j) { - if (seed2) - v ^= seed2.charCodeAt((j + 32) % seed2.length); - if (j === 0) - w = v; - v ^= v << 10; - v ^= v >>> 15; - v ^= v << 4; - v ^= v >>> 13; - if (j >= 0) { - w = w + 1640531527 | 0; - t = X[j & 127] ^= v + w; - i = t == 0 ? i + 1 : 0; - } - } - if (i >= 128) { - X[(seed2 && seed2.length || 0) & 127] = -1; - } - i = 127; - for (j = 4 * 128; j > 0; --j) { - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - X[i] = v ^ t; - } - me2.w = w; - me2.X = X; - me2.i = i; - } - init2(me, seed); - } - function copy(f, t) { - t.i = f.i; - t.w = f.w; - t.X = f.X.slice(); - return t; - } - ; - function impl(seed, opts) { - if (seed == null) - seed = +new Date(); - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.X) - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xor4096 = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_tychei2 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/tychei.js"(exports, module2) { - (function(global2, module22, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.next = function() { - var b = me.b, c = me.c, d = me.d, a = me.a; - b = b << 25 ^ b >>> 7 ^ c; - c = c - d | 0; - d = d << 24 ^ d >>> 8 ^ a; - a = a - b | 0; - me.b = b = b << 20 ^ b >>> 12 ^ c; - me.c = c = c - d | 0; - me.d = d << 16 ^ c >>> 16 ^ a; - return me.a = a - b | 0; - }; - me.a = 0; - me.b = 0; - me.c = 2654435769 | 0; - me.d = 1367130551; - if (seed === Math.floor(seed)) { - me.a = seed / 4294967296 | 0; - me.b = seed | 0; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 20; k++) { - me.b ^= strseed.charCodeAt(k) | 0; - me.next(); - } - } - function copy(f, t) { - t.a = f.a; - t.b = f.b; - t.c = f.c; - t.d = f.d; - return t; - } - ; - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module22 && module22.exports) { - module22.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.tychei = impl; - } - })(exports, typeof module2 == "object" && module2, typeof define == "function" && define); - } - }); - var require_seedrandom3 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/seedrandom.js"(exports, module2) { - (function(global2, pool3, math) { - var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; - function seedrandom5(seed, options, callback) { - var key = []; - options = options == true ? { entropy: true } : options || {}; - var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); - var arc4 = new ARC4(key); - var prng = function() { - var n = arc4.g(chunks), d = startdenom, x = 0; - while (n < significance) { - n = (n + x) * width; - d *= width; - x = arc4.g(1); - } - while (n >= overflow) { - n /= 2; - d /= 2; - x >>>= 1; - } - return (n + x) / d; - }; - prng.int32 = function() { - return arc4.g(4) | 0; - }; - prng.quick = function() { - return arc4.g(4) / 4294967296; - }; - prng.double = prng; - mixkey(tostring(arc4.S), pool3); - return (options.pass || callback || function(prng2, seed2, is_math_call, state) { - if (state) { - if (state.S) { - copy(state, arc4); - } - prng2.state = function() { - return copy(arc4, {}); - }; - } - if (is_math_call) { - math[rngname] = prng2; - return seed2; - } else - return prng2; - })(prng, shortseed, "global" in options ? options.global : this == math, options.state); - } - function ARC4(key) { - var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; - if (!keylen) { - key = [keylen++]; - } - while (i < width) { - s[i] = i++; - } - for (i = 0; i < width; i++) { - s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; - s[j] = t; - } - (me.g = function(count2) { - var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; - while (count2--) { - t2 = s2[i2 = mask & i2 + 1]; - r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; - } - me.i = i2; - me.j = j2; - return r; - })(width); - } - function copy(f, t) { - t.i = f.i; - t.j = f.j; - t.S = f.S.slice(); - return t; - } - ; - function flatten4(obj, depth) { - var result = [], typ = typeof obj, prop; - if (depth && typ == "object") { - for (prop in obj) { - try { - result.push(flatten4(obj[prop], depth - 1)); - } catch (e) { - } - } - } - return result.length ? result : typ == "string" ? obj : obj + "\0"; - } - function mixkey(seed, key) { - var stringseed = seed + "", smear, j = 0; - while (j < stringseed.length) { - key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); - } - return tostring(key); - } - function autoseed() { - try { - var out; - if (nodecrypto && (out = nodecrypto.randomBytes)) { - out = out(width); - } else { - out = new Uint8Array(width); - (global2.crypto || global2.msCrypto).getRandomValues(out); - } - return tostring(out); - } catch (e) { - var browser2 = global2.navigator, plugins = browser2 && browser2.plugins; - return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; - } - } - function tostring(a) { - return String.fromCharCode.apply(0, a); - } - mixkey(math.random(), pool3); - if (typeof module2 == "object" && module2.exports) { - module2.exports = seedrandom5; - try { - nodecrypto = require_crypto(); - } catch (ex) { - } - } else if (typeof define == "function" && define.amd) { - define(function() { - return seedrandom5; - }); - } else { - math["seed" + rngname] = seedrandom5; - } - })(typeof self !== "undefined" ? self : exports, [], Math); - } - }); - var require_seedrandom4 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/index.js"(exports, module2) { - var alea5 = require_alea2(); - var xor128 = require_xor1282(); - var xorwow = require_xorwow2(); - var xorshift7 = require_xorshift72(); - var xor4096 = require_xor40962(); - var tychei = require_tychei2(); - var sr = require_seedrandom3(); - sr.alea = alea5; - sr.xor128 = xor128; - sr.xorwow = xorwow; - sr.xorshift7 = xorshift7; - sr.xor4096 = xor4096; - sr.tychei = tychei; - module2.exports = sr; - } - }); - var require_string_decoder = __commonJS({ - "(disabled):node_modules/.pnpm/string_decoder@1.1.1/node_modules/string_decoder/lib/string_decoder.js"() { - } - }); - var require_path = __commonJS({ - "(disabled):path"() { - } - }); - var require_worker_threads = __commonJS({ - "(disabled):worker_threads"() { - } - }); - var require_perf_hooks = __commonJS({ - "(disabled):perf_hooks"() { - } - }); - var require_tfjs_backend_wasm_threaded_simd = __commonJS({ - "node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.9.0_@tensorflow+tfjs-core@3.9.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"(exports, module2) { - var WasmBackendModuleThreadedSimd = function() { - var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; - if (typeof __filename !== "undefined") - _scriptDir = _scriptDir || __filename; - return function(WasmBackendModuleThreadedSimd2) { - WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; - function GROWABLE_HEAP_I8() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAP8; - } - function GROWABLE_HEAP_U8() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAPU8; - } - function GROWABLE_HEAP_I32() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAP32; - } - function GROWABLE_HEAP_U32() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAPU32; - } - function GROWABLE_HEAP_F64() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAPF64; - } - var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; - var readyPromiseResolve, readyPromiseReject; - Module["ready"] = new Promise(function(resolve, reject) { - readyPromiseResolve = resolve; - readyPromiseReject = reject; - }); - var moduleOverrides = {}; - var key; - for (key in Module) { - if (Module.hasOwnProperty(key)) { - moduleOverrides[key] = Module[key]; - } - } - var arguments_ = []; - var thisProgram = "./this.program"; - var quit_ = function(status, toThrow) { - throw toThrow; - }; - var ENVIRONMENT_IS_WEB = false; - var ENVIRONMENT_IS_WORKER = false; - var ENVIRONMENT_IS_NODE = false; - var ENVIRONMENT_IS_SHELL = false; - ENVIRONMENT_IS_WEB = typeof window === "object"; - ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; - ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; - ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; - if (ENVIRONMENT_IS_PTHREAD) { - buffer2 = Module["buffer"]; - } - var scriptDirectory = ""; - function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; - } - var read_, readAsync, readBinary, setWindowTitle; - var nodeFS; - var nodePath; - if (ENVIRONMENT_IS_NODE) { - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = require_path().dirname(scriptDirectory) + "/"; - } else { - scriptDirectory = __dirname + "/"; - } - read_ = function shell_read(filename, binary) { - if (!nodeFS) - nodeFS = __require2("fs"); - if (!nodePath) - nodePath = require_path(); - filename = nodePath["normalize"](filename); - return nodeFS["readFileSync"](filename, binary ? null : "utf8"); - }; - readBinary = function readBinary2(filename) { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert3(ret.buffer); - return ret; - }; - 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", abort); - quit_ = function(status) { - process["exit"](status); - }; - Module["inspect"] = function() { - return "[Emscripten Module object]"; - }; - var nodeWorkerThreads; - try { - nodeWorkerThreads = require_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; - } - global.Worker = nodeWorkerThreads.Worker; - } else if (ENVIRONMENT_IS_SHELL) { - if (typeof read != "undefined") { - read_ = function shell_read(f) { - return read(f); - }; - } - readBinary = function readBinary2(f) { - var data; - if (typeof readbuffer === "function") { - return new Uint8Array(readbuffer(f)); - } - data = read(f, "binary"); - assert3(typeof data === "object"); - return data; - }; - if (typeof scriptArgs != "undefined") { - arguments_ = scriptArgs; - } else if (typeof arguments != "undefined") { - arguments_ = arguments; - } - if (typeof quit === "function") { - quit_ = function(status) { - quit(status); - }; - } - if (typeof print !== "undefined") { - if (typeof console === "undefined") - console = {}; - console.log = print; - console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; - } - } 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.lastIndexOf("/") + 1); - } else { - scriptDirectory = ""; - } - if (ENVIRONMENT_IS_NODE) { - read_ = function shell_read(filename, binary) { - if (!nodeFS) - nodeFS = __require2("fs"); - if (!nodePath) - nodePath = require_path(); - filename = nodePath["normalize"](filename); - return nodeFS["readFileSync"](filename, binary ? null : "utf8"); - }; - readBinary = function readBinary2(filename) { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert3(ret.buffer); - return ret; - }; - } else { - read_ = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.send(null); - return xhr.responseText; - }; - if (ENVIRONMENT_IS_WORKER) { - readBinary = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.responseType = "arraybuffer"; - xhr.send(null); - return new Uint8Array(xhr.response); - }; - } - readAsync = function(url, onload, onerror) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, true); - xhr.responseType = "arraybuffer"; - xhr.onload = function() { - if (xhr.status == 200 || xhr.status == 0 && xhr.response) { - onload(xhr.response); - return; - } - onerror(); - }; - xhr.onerror = onerror; - xhr.send(null); - }; - } - setWindowTitle = function(title) { - document.title = title; - }; - } else { - } - if (ENVIRONMENT_IS_NODE) { - if (typeof performance === "undefined") { - global.performance = require_perf_hooks().performance; - } - } - var out = Module["print"] || console.log.bind(console); - var err = Module["printErr"] || console.warn.bind(console); - for (key in moduleOverrides) { - if (moduleOverrides.hasOwnProperty(key)) { - Module[key] = moduleOverrides[key]; - } - } - moduleOverrides = null; - if (Module["arguments"]) - arguments_ = Module["arguments"]; - if (Module["thisProgram"]) - thisProgram = Module["thisProgram"]; - if (Module["quit"]) - quit_ = Module["quit"]; - var Atomics_load = Atomics.load; - var Atomics_store = Atomics.store; - var Atomics_compareExchange = Atomics.compareExchange; - 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 assert3(condition, text) { - if (!condition) { - abort("Assertion failed: " + text); - } - } - function getCFunc(ident) { - var func2 = Module["_" + ident]; - assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); - return func2; - } - function ccall(ident, returnType, argTypes, args, opts) { - var toC = { "string": function(str) { - var ret2 = 0; - if (str !== null && str !== void 0 && str !== 0) { - var len = (str.length << 2) + 1; - ret2 = stackAlloc(len); - stringToUTF8(str, ret2, len); - } - return ret2; - }, "array": function(arr) { - var ret2 = stackAlloc(arr.length); - writeArrayToMemory(arr, ret2); - return ret2; - } }; - function convertReturnValue(ret2) { - if (returnType === "string") - return UTF8ToString(ret2); - if (returnType === "boolean") - return Boolean(ret2); - return ret2; - } - var func2 = getCFunc(ident); - var cArgs = []; - var stack2 = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack2 === 0) - stack2 = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func2.apply(null, cArgs); - ret = convertReturnValue(ret); - if (stack2 !== 0) - stackRestore(stack2); - return ret; - } - function cwrap(ident, returnType, argTypes, opts) { - argTypes = argTypes || []; - var numericArgs = argTypes.every(function(type) { - return type === "number"; - }); - var numericRet = returnType !== "string"; - if (numericRet && numericArgs && !opts) { - return getCFunc(ident); - } - return function() { - return ccall(ident, returnType, argTypes, arguments, opts); - }; - } - function UTF8ArrayToString(heap, idx, maxBytesToRead) { - var endIdx = idx + maxBytesToRead; - var str = ""; - while (!(idx >= endIdx)) { - var u0 = heap[idx++]; - if (!u0) - return str; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heap[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode((u0 & 31) << 6 | u1); - continue; - } - var u2 = heap[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = (u0 & 15) << 12 | u1 << 6 | u2; - } else { - u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | ch >> 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 < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 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 < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 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; - } - function writeArrayToMemory(array2, buffer3) { - GROWABLE_HEAP_I8().set(array2, buffer3); - } - function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - x % multiple; - } - return x; - } - var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; - function updateGlobalBufferAndViews(buf) { - buffer2 = 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"]; - buffer2 = 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) { - buffer2 = wasmMemory.buffer; - } - INITIAL_MEMORY = buffer2.byteLength; - updateGlobalBufferAndViews(buffer2); - var wasmTable; - var __ATPRERUN__ = []; - var __ATINIT__ = []; - var __ATMAIN__ = []; - var __ATEXIT__ = []; - var __ATPOSTRUN__ = []; - var runtimeInitialized = false; - var runtimeExited = false; - if (!ENVIRONMENT_IS_PTHREAD) - __ATINIT__.push({ func: function() { - ___wasm_call_ctors(); - } }); - function preRun() { - if (ENVIRONMENT_IS_PTHREAD) - return; - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") - Module["preRun"] = [Module["preRun"]]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); - } - function initRuntime() { - runtimeInitialized = true; - if (ENVIRONMENT_IS_PTHREAD) - return; - callRuntimeCallbacks(__ATINIT__); - } - function preMain() { - if (ENVIRONMENT_IS_PTHREAD) - return; - callRuntimeCallbacks(__ATMAIN__); - } - function exitRuntime() { - if (ENVIRONMENT_IS_PTHREAD) - return; - runtimeExited = true; - } - 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 addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); - } - var runDependencies = 0; - var runDependencyWatcher = null; - var dependenciesFulfilled = null; - function addRunDependency(id) { - assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); - runDependencies++; - if (Module["monitorRunDependencies"]) { - Module["monitorRunDependencies"](runDependencies); - } - } - function removeRunDependency(id) { - runDependencies--; - if (Module["monitorRunDependencies"]) { - Module["monitorRunDependencies"](runDependencies); - } - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } - } - Module["preloadedImages"] = {}; - Module["preloadedAudios"] = {}; - function abort(what) { - if (Module["onAbort"]) { - Module["onAbort"](what); - } - if (ENVIRONMENT_IS_PTHREAD) - console.error("Pthread aborting at " + new Error().stack); - what += ""; - err(what); - ABORT = true; - EXITSTATUS = 1; - what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; - } - function hasPrefix(str, prefix) { - return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; - } - var dataURIPrefix = "data:application/octet-stream;base64,"; - function isDataURI(filename) { - return hasPrefix(filename, dataURIPrefix); - } - var fileURIPrefix = "file://"; - function isFileURI(filename) { - return hasPrefix(filename, fileURIPrefix); - } - var 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 (err2) { - abort(err2); - } - } - 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 = { "a": asmLibraryArg }; - function receiveInstance(instance, module22) { - var exports3 = instance.exports; - Module["asm"] = exports3; - wasmTable = Module["asm"]["F"]; - wasmModule = module22; - if (!ENVIRONMENT_IS_PTHREAD) { - var numWorkersToLoad = PThread.unusedWorkers.length; - PThread.unusedWorkers.forEach(function(w) { - PThread.loadWasmModuleToWorker(w, function() { - if (!--numWorkersToLoad) - removeRunDependency("wasm-instantiate"); - }); - }); - } - } - if (!ENVIRONMENT_IS_PTHREAD) { - addRunDependency("wasm-instantiate"); - } - function receiveInstantiatedSource(output) { - receiveInstance(output["instance"], output["module"]); - } - function instantiateArrayBuffer(receiver) { - return getBinaryPromise().then(function(binary) { - return WebAssembly.instantiate(binary, info); - }).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(receiveInstantiatedSource, function(reason) { - err("wasm streaming compile failed: " + reason); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(receiveInstantiatedSource); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiatedSource); - } - } - if (Module["instantiateWasm"]) { - try { - var exports2 = Module["instantiateWasm"](info, receiveInstance); - return exports2; - } catch (e) { - err("Module.instantiateWasm callback failed with error: " + e); - return false; - } - } - instantiateAsync().catch(readyPromiseReject); - return {}; - } - var ASM_CONSTS = { 10024: function() { - throw "Canceled!"; - }, 10042: function($0, $1) { - setTimeout(function() { - __emscripten_do_dispatch_to_thread($0, $1); - }, 0); - } }; - function initPthreadsJS() { - PThread.initRuntime(); - } - function callRuntimeCallbacks(callbacks2) { - while (callbacks2.length > 0) { - var callback = callbacks2.shift(); - if (typeof callback == "function") { - callback(Module); - continue; - } - var func2 = callback.func; - if (typeof func2 === "number") { - if (callback.arg === void 0) { - wasmTable.get(func2)(); - } else { - wasmTable.get(func2)(callback.arg); - } - } else { - func2(callback.arg === void 0 ? null : callback.arg); - } - } - } - function _emscripten_futex_wake(addr, count2) { - if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count2 < 0) - return -28; - if (count2 == 0) - return 0; - if (count2 >= 2147483647) - count2 = Infinity; - var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2); - var mainThreadWoken = 0; - if (mainThreadWaitAddress == addr) { - var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0); - if (loadedAddr == mainThreadWaitAddress) { - --count2; - mainThreadWoken = 1; - if (count2 <= 0) - return 1; - } - } - var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count2); - if (ret >= 0) - return ret + mainThreadWoken; - throw "Atomics.notify returned an unexpected value " + ret; - } - Module["_emscripten_futex_wake"] = _emscripten_futex_wake; - function killThread(pthread_ptr) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! killThread() can only ever be called from main application thread!"; - if (!pthread_ptr) - throw "Internal Error! Null pthread_ptr in killThread!"; - GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; - var pthread = PThread.pthreads[pthread_ptr]; - pthread.worker.terminate(); - PThread.freeThreadData(pthread); - PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); - pthread.worker.pthread = void 0; - } - function cancelThread(pthread_ptr) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! cancelThread() can only ever be called from main application thread!"; - if (!pthread_ptr) - throw "Internal Error! Null pthread_ptr in cancelThread!"; - var pthread = PThread.pthreads[pthread_ptr]; - pthread.worker.postMessage({ "cmd": "cancel" }); - } - function cleanupThread(pthread_ptr) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; - if (!pthread_ptr) - throw "Internal Error! Null pthread_ptr in cleanupThread!"; - var pthread = PThread.pthreads[pthread_ptr]; - if (pthread) { - GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; - var worker = pthread.worker; - PThread.returnWorkerToPool(worker); - } - } - var PThread = { unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { - var pthreadPoolSize = Math.min(4, Math.max(1, (navigator.hardwareConcurrency || 1) / 2)); - for (var i = 0; i < pthreadPoolSize; ++i) { - PThread.allocateUnusedWorker(); - } - }, initRuntime: function() { - var tb = _malloc(228); - for (var i = 0; i < 228 / 4; ++i) - GROWABLE_HEAP_U32()[tb / 4 + i] = 0; - GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; - var headPtr = tb + 152; - GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; - var tlsMemory = _malloc(512); - for (var i = 0; i < 128; ++i) - GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; - Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); - Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); - __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); - _emscripten_register_main_browser_thread_id(tb); - }, initWorker: function() { - }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { - }, runExitHandlers: function() { - while (PThread.threadExitHandlers.length > 0) { - PThread.threadExitHandlers.pop()(); - } - if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) - ___pthread_tsd_run_dtors(); - }, runExitHandlersAndDeinitThread: function(tb, exitCode) { - Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1); - Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); - PThread.runExitHandlers(); - Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); - Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); - _emscripten_futex_wake(tb + 0, 2147483647); - __emscripten_thread_init(0, 0, 0); - }, threadExit: function(exitCode) { - var tb = _pthread_self(); - if (tb) { - PThread.runExitHandlersAndDeinitThread(tb, exitCode); - if (ENVIRONMENT_IS_PTHREAD) { - postMessage({ "cmd": "exit" }); - } - } - }, threadCancel: function() { - PThread.runExitHandlersAndDeinitThread(_pthread_self(), -1); - postMessage({ "cmd": "cancelDone" }); - }, terminateAllThreads: function() { - for (var t in PThread.pthreads) { - var pthread = PThread.pthreads[t]; - if (pthread && pthread.worker) { - PThread.returnWorkerToPool(pthread.worker); - } - } - PThread.pthreads = {}; - for (var i = 0; i < PThread.unusedWorkers.length; ++i) { - var worker = PThread.unusedWorkers[i]; - worker.terminate(); - } - PThread.unusedWorkers = []; - for (var i = 0; i < PThread.runningWorkers.length; ++i) { - var worker = PThread.runningWorkers[i]; - var pthread = worker.pthread; - PThread.freeThreadData(pthread); - worker.terminate(); - } - PThread.runningWorkers = []; - }, freeThreadData: function(pthread) { - if (!pthread) - return; - if (pthread.threadInfoStruct) { - var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2]; - GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0; - _free(tlsMemory); - _free(pthread.threadInfoStruct); - } - pthread.threadInfoStruct = 0; - if (pthread.allocatedOwnStack && pthread.stackBase) - _free(pthread.stackBase); - pthread.stackBase = 0; - if (pthread.worker) - pthread.worker.pthread = null; - }, returnWorkerToPool: function(worker) { - PThread.runWithoutMainThreadQueuedCalls(function() { - delete PThread.pthreads[worker.pthread.threadInfoStruct]; - PThread.unusedWorkers.push(worker); - PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); - PThread.freeThreadData(worker.pthread); - worker.pthread = void 0; - }); - }, runWithoutMainThreadQueuedCalls: function(func2) { - GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; - try { - func2(); - } finally { - GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; - } - }, receiveObjectTransfer: function(data) { - }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { - worker.onmessage = function(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(e.data, d["transferList"]); - } else { - console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); - } - PThread.currentProxiedOperationCallerThread = void 0; - return; - } - if (cmd === "processQueuedMainThreadWork") { - _emscripten_main_thread_process_queued_calls(); - } else if (cmd === "spawnThread") { - spawnThread(e.data); - } 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 (cmd === "exit") { - var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.threadInfoStruct + 64 >> 2); - if (detached) { - PThread.returnWorkerToPool(worker); - } - } else if (cmd === "exitProcess") { - try { - exit(d["returnCode"]); - } catch (e2) { - if (e2 instanceof ExitStatus) - return; - throw e2; - } - } else if (cmd === "cancelDone") { - PThread.returnWorkerToPool(worker); - } else if (cmd === "objectTransfer") { - PThread.receiveObjectTransfer(e.data); - } else if (e.data.target === "setimmediate") { - worker.postMessage(e.data); - } else { - err("worker sent an unknown command " + cmd); - } - PThread.currentProxiedOperationCallerThread = void 0; - }; - worker.onerror = function(e) { - err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); - }; - if (ENVIRONMENT_IS_NODE) { - worker.on("message", function(data) { - worker.onmessage({ data }); - }); - worker.on("error", function(data) { - worker.onerror(data); - }); - worker.on("exit", function(data) { - }); - } - 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]); - } - if (PThread.unusedWorkers.length > 0) - return PThread.unusedWorkers.pop(); - else - return null; - }, busySpinWait: function(msecs) { - var t = performance.now() + msecs; - while (performance.now() < t) { - } - } }; - function establishStackSpace(stackTop, stackMax) { - _emscripten_stack_set_limits(stackTop, stackMax); - stackRestore(stackTop); - } - Module["establishStackSpace"] = establishStackSpace; - function getNoExitRuntime() { - return noExitRuntime; - } - Module["getNoExitRuntime"] = getNoExitRuntime; - function invokeEntryPoint(ptr, arg) { - return wasmTable.get(ptr)(arg); - } - Module["invokeEntryPoint"] = invokeEntryPoint; - function ___assert_fail(condition, filename, line, func2) { - abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); - } - function ___call_main(argc, argv) { - var returnCode = _main(argc, argv); - } - var _emscripten_get_now; - if (ENVIRONMENT_IS_NODE) { - _emscripten_get_now = function() { - var t = process["hrtime"](); - return t[0] * 1e3 + t[1] / 1e6; - }; - } else if (ENVIRONMENT_IS_PTHREAD) { - _emscripten_get_now = function() { - return performance.now() - Module["__performance_now_clock_drift"]; - }; - } else if (typeof dateNow !== "undefined") { - _emscripten_get_now = dateNow; - } else - _emscripten_get_now = function() { - return performance.now(); - }; - function setErrNo(value) { - GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; - return value; - } - function _atexit(func2, arg) { - if (ENVIRONMENT_IS_PTHREAD) - return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); - } - 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_asm_const_int(code, sigPtr, argbuf) { - var args = readAsmConstArgs(sigPtr, argbuf); - return ASM_CONSTS[code].apply(null, args); - } - function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { - } - function _emscripten_futex_wait(addr, val, timeout) { - if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) - return -28; - if (!ENVIRONMENT_IS_WEB) { - var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); - if (ret === "timed-out") - return -73; - if (ret === "not-equal") - return -6; - if (ret === "ok") - return 0; - throw "Atomics.wait returned an unexpected value " + ret; - } else { - if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { - return -6; - } - var tNow = performance.now(); - var tEnd = tNow + timeout; - var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); - while (1) { - tNow = performance.now(); - if (tNow > tEnd) { - lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); - return -73; - } - lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); - if (lastAddr == 0) { - break; - } - _emscripten_main_thread_process_queued_calls(); - if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { - return -6; - } - lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); - } - return 0; - } - } - 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 __require2("os").cpus().length; - return navigator["hardwareConcurrency"]; - } - function _emscripten_proxy_to_main_thread_js(index, sync) { - var numCallArgs = arguments.length - 2; - var stack2 = stackSave(); - var serializedNumCallArgs = numCallArgs; - var args = stackAlloc(serializedNumCallArgs * 8); - var b = args >> 3; - for (var i = 0; i < numCallArgs; i++) { - var arg = arguments[2 + i]; - GROWABLE_HEAP_F64()[b + i] = arg; - } - var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); - stackRestore(stack2); - return ret; - } - var _emscripten_receive_on_main_thread_js_callArgs = []; - var readAsmConstArgsArray = []; - function readAsmConstArgs(sigPtr, buf) { - readAsmConstArgsArray.length = 0; - var ch; - buf >>= 2; - while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { - var double = ch < 105; - if (double && buf & 1) - buf++; - readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); - ++buf; - } - return readAsmConstArgsArray; - } - function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { - _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; - var b = args >> 3; - for (var i = 0; i < numCallArgs; i++) { - _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; - } - var isEmAsmConst = index < 0; - var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; - return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); - } - function _emscripten_get_heap_size() { - return GROWABLE_HEAP_U8().length; - } - function emscripten_realloc_buffer(size) { - try { - wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); - updateGlobalBufferAndViews(wasmMemory.buffer); - return 1; - } catch (e) { - } - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = _emscripten_get_heap_size(); - if (requestedSize <= oldSize) { - return false; - } - var maxHeapSize = 2147483648; - if (requestedSize > maxHeapSize) { - return false; - } - for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { - var overGrownHeapSize = oldSize * (1 + 0.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) { - __ATEXIT__.push(JSEvents.removeAllEventListeners); - JSEvents.removeEventListenersRegistered = true; - } - }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { - function arraysHaveEqualContent(arrA, arrB) { - if (arrA.length != arrB.length) - return false; - for (var i2 in arrA) { - if (arrA[i2] != arrB[i2]) - 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, precedence, argsList }); - JSEvents.deferredCalls.sort(function(x, y) { - return x.precedence < y.precedence; - }); - }, removeDeferredCalls: function(targetFunction) { - for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { - if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { - JSEvents.deferredCalls.splice(i, 1); - --i; - } - } - }, canPerformEventHandlerRequests: function() { - return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; - }, runDeferredCalls: function() { - if (!JSEvents.canPerformEventHandlerRequests()) { - return; - } - for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { - var call = JSEvents.deferredCalls[i]; - JSEvents.deferredCalls.splice(i, 1); - --i; - call.targetFunction.apply(null, call.argsList); - } - }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { - for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { - if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { - JSEvents._removeHandler(i--); - } - } - }, _removeHandler: function(i) { - var h = JSEvents.eventHandlers[i]; - h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); - JSEvents.eventHandlers.splice(i, 1); - }, registerOrRemoveHandler: function(eventHandler) { - var jsEventHandler = function jsEventHandler2(event) { - ++JSEvents.inEventHandler; - JSEvents.currentEventHandler = eventHandler; - JSEvents.runDeferredCalls(); - eventHandler.handlerFunc(event); - JSEvents.runDeferredCalls(); - --JSEvents.inEventHandler; - }; - if (eventHandler.callbackfunc) { - eventHandler.eventListenerFunc = jsEventHandler; - eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); - JSEvents.eventHandlers.push(eventHandler); - JSEvents.registerRemoveEventListeners(); - } else { - for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { - if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { - JSEvents._removeHandler(i--); - } - } - } - }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { - var stackTop = stackSave(); - var varargs = stackAlloc(12); - GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; - GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; - GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; - __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); - stackRestore(stackTop); - }, 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) { - var stackTop = stackSave(); - 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_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); - stackRestore(stackTop); - } - 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) : void 0); - 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_set_current_thread_status(newStatus) { - } - function _emscripten_set_thread_name(threadId, name) { - } - 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, count2, primcount) { - ext["drawArraysInstancedANGLE"](mode, first, count2, primcount); - }; - ctx["drawElementsInstanced"] = function(mode, count2, type, indices, primcount) { - ext["drawElementsInstancedANGLE"](mode, count2, 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: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, 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 < ret; i++) { - table[i] = null; - } - return ret; - }, getSource: function(shader, count2, string3, length) { - var source = ""; - for (var i = 0; i < count2; ++i) { - var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; - source += UTF8ToString(GROWABLE_HEAP_I32()[string3 + i * 4 >> 2], len < 0 ? void 0 : len); - } - return source; - }, createContext: function(canvas, webGLContextAttributes) { - 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, 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 = void 0; - _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 GLctx2 = context.GLctx; - __webgl_enable_ANGLE_instanced_arrays(GLctx2); - __webgl_enable_OES_vertex_array_object(GLctx2); - __webgl_enable_WEBGL_draw_buffers(GLctx2); - GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); - __webgl_enable_WEBGL_multi_draw(GLctx2); - var exts = GLctx2.getSupportedExtensions() || []; - exts.forEach(function(ext) { - if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { - GLctx2.getExtension(ext); - } - }); - }, populateUniformTable: function(program) { - var p2 = GL.programs[program]; - var ptable = GL.programInfos[program] = { uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1 }; - var utable = ptable.uniforms; - var numUniforms = GLctx.getProgramParameter(p2, 35718); - for (var i = 0; i < numUniforms; ++i) { - var u = GLctx.getActiveUniform(p2, i); - var name = u.name; - ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1); - if (name.slice(-1) == "]") { - name = name.slice(0, name.lastIndexOf("[")); - } - var loc = GLctx.getUniformLocation(p2, name); - if (loc) { - var id = GL.getNewId(GL.uniforms); - utable[name] = [u.size, id]; - GL.uniforms[id] = loc; - for (var j = 1; j < u.size; ++j) { - var n = name + "[" + j + "]"; - loc = GLctx.getUniformLocation(p2, n); - id = GL.getNewId(GL.uniforms); - GL.uniforms[id] = loc; - } - } - } - } }; - 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, a12) { - return _emscripten_webgl_do_create_context(a0, a12); - } - var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { - var buffer3 = SYSCALLS.buffers[stream]; - if (curr === 0 || curr === 10) { - (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); - buffer3.length = 0; - } else { - buffer3.push(curr); - } - }, varargs: void 0, 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 < iovcnt; i++) { - var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; - var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; - for (var j = 0; j < len; j++) { - SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); - } - num += len; - } - GROWABLE_HEAP_I32()[pnum >> 2] = num; - return 0; - } - function _pthread_cleanup_pop(execute2) { - var routine = PThread.threadExitHandlers.pop(); - if (execute2) - routine(); - } - function _pthread_cleanup_push(routine, arg) { - PThread.threadExitHandlers.push(function() { - wasmTable.get(routine)(arg); - }); - } - function spawnThread(threadParams) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! spawnThread() can only ever be called from main application thread!"; - var worker = PThread.getNewWorker(); - if (worker.pthread !== void 0) - throw "Internal error!"; - if (!threadParams.pthread_ptr) - throw "Internal error, no pthread ptr!"; - PThread.runningWorkers.push(worker); - var tlsMemory = _malloc(128 * 4); - for (var i = 0; i < 128; ++i) { - GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; - } - var stackHigh = threadParams.stackBase + threadParams.stackSize; - var pthread = PThread.pthreads[threadParams.pthread_ptr] = { worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr }; - var tis = pthread.threadInfoStruct >> 2; - Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); - Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); - Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); - Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); - Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); - Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); - Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); - Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); - var global_libc = _emscripten_get_global_libc(); - var global_locale = global_libc + 40; - Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); - worker.pthread = pthread; - var msg = { "cmd": "run", "start_routine": threadParams.startRoutine, "arg": threadParams.arg, "threadInfoStruct": threadParams.pthread_ptr, "stackBase": threadParams.stackBase, "stackSize": threadParams.stackSize }; - worker.runPthread = function() { - msg.time = performance.now(); - worker.postMessage(msg, threadParams.transferList); - }; - if (worker.loaded) { - worker.runPthread(); - delete worker.runPthread; - } - } - function _pthread_create(pthread_ptr, attr, start_routine, arg) { - if (typeof SharedArrayBuffer === "undefined") { - err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); - return 6; - } - if (!pthread_ptr) { - err("pthread_create called with a null thread pointer!"); - return 28; - } - 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); - } - if (error) - return error; - var stackSize = 0; - var stackBase = 0; - var detached = 0; - if (attr && attr != -1) { - stackSize = GROWABLE_HEAP_I32()[attr >> 2]; - stackSize += 81920; - stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; - detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; - } else { - stackSize = 2097152; - } - var allocatedOwnStack = stackBase == 0; - if (allocatedOwnStack) { - stackBase = _memalign(16, stackSize); - } else { - stackBase -= stackSize; - assert3(stackBase > 0); - } - var threadInfoStruct = _malloc(228); - for (var i = 0; i < 228 >> 2; ++i) - GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; - GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; - GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; - var headPtr = threadInfoStruct + 152; - GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; - var threadParams = { stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList }; - if (ENVIRONMENT_IS_PTHREAD) { - threadParams.cmd = "spawnThread"; - postMessage(threadParams, transferList); - } else { - spawnThread(threadParams); - } - return 0; - } - function _sysconf(name) { - if (ENVIRONMENT_IS_PTHREAD) - return _emscripten_proxy_to_main_thread_js(6, 1, name); - switch (name) { - case 30: - return 16384; - case 85: - var maxHeapSize = 2147483648; - return maxHeapSize / 16384; - case 132: - case 133: - case 12: - case 137: - case 138: - case 15: - case 235: - case 16: - case 17: - case 18: - case 19: - case 20: - case 149: - case 13: - case 10: - case 236: - case 153: - case 9: - case 21: - case 22: - case 159: - case 154: - case 14: - case 77: - case 78: - case 139: - case 82: - case 68: - case 67: - case 164: - case 11: - case 29: - case 47: - case 48: - case 95: - case 52: - case 51: - case 46: - return 200809; - case 27: - case 246: - case 127: - case 128: - case 23: - case 24: - case 160: - case 161: - case 181: - case 182: - case 242: - case 183: - case 184: - case 243: - case 244: - case 245: - case 165: - case 178: - case 179: - case 49: - case 50: - case 168: - case 169: - case 175: - case 170: - case 171: - case 172: - case 97: - case 76: - case 32: - case 173: - case 35: - case 80: - case 81: - case 79: - return -1; - case 176: - case 177: - case 7: - case 155: - case 8: - case 157: - case 125: - case 126: - case 92: - case 93: - case 129: - case 130: - case 131: - case 94: - case 91: - return 1; - case 74: - case 60: - case 69: - case 70: - case 4: - return 1024; - case 31: - case 42: - case 72: - return 32; - case 87: - case 26: - case 33: - return 2147483647; - case 34: - case 1: - return 47839; - case 38: - case 36: - return 99; - case 43: - case 37: - return 2048; - case 0: - return 2097152; - case 3: - return 65536; - case 28: - return 32768; - case 44: - return 32767; - case 75: - return 16384; - case 39: - return 1e3; - case 89: - return 700; - case 71: - return 256; - case 40: - return 255; - case 2: - return 100; - case 180: - return 64; - case 25: - return 20; - case 5: - return 16; - case 6: - return 6; - case 73: - return 4; - case 84: { - if (typeof navigator === "object") - return navigator["hardwareConcurrency"] || 1; - return 1; - } - } - setErrNo(28); - return -1; - } - if (!ENVIRONMENT_IS_PTHREAD) - PThread.initMainThreadBlock(); - var GLctx; - var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; - var asmLibraryArg = { "e": ___assert_fail, "r": ___call_main, "x": __emscripten_notify_thread_queue, "b": _abort, "y": _emscripten_asm_const_int, "j": _emscripten_conditional_set_current_thread_status, "c": _emscripten_futex_wait, "d": _emscripten_futex_wake, "f": _emscripten_get_now, "p": _emscripten_memcpy_big, "z": _emscripten_num_logical_cores, "u": _emscripten_receive_on_main_thread_js, "q": _emscripten_resize_heap, "v": _emscripten_set_canvas_element_size, "i": _emscripten_set_current_thread_status, "t": _emscripten_set_thread_name, "w": _emscripten_webgl_create_context, "m": _fd_close, "n": _fd_seek, "g": _fd_write, "o": initPthreadsJS, "a": wasmMemory || Module["wasmMemory"], "k": _pthread_cleanup_pop, "l": _pthread_cleanup_push, "h": _pthread_create, "s": _sysconf }; - var asm = createWasm(); - var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { - return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); - }; - var _init = Module["_init"] = function() { - return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); - }; - var _register_tensor = Module["_register_tensor"] = function() { - return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); - }; - var _dispose_data = Module["_dispose_data"] = function() { - return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); - }; - var _dispose = Module["_dispose"] = function() { - return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); - }; - var _Abs = Module["_Abs"] = function() { - return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); - }; - var _Add = Module["_Add"] = function() { - return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); - }; - var _AddN = Module["_AddN"] = function() { - return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); - }; - var _All = Module["_All"] = function() { - return (_All = Module["_All"] = Module["asm"]["J"]).apply(null, arguments); - }; - var _Any = Module["_Any"] = function() { - return (_Any = Module["_Any"] = Module["asm"]["K"]).apply(null, arguments); - }; - var _ArgMax = Module["_ArgMax"] = function() { - return (_ArgMax = Module["_ArgMax"] = Module["asm"]["L"]).apply(null, arguments); - }; - var _AvgPool = Module["_AvgPool"] = function() { - return (_AvgPool = Module["_AvgPool"] = Module["asm"]["M"]).apply(null, arguments); - }; - var _BatchMatMul = Module["_BatchMatMul"] = function() { - return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["N"]).apply(null, arguments); - }; - var _Ceil = Module["_Ceil"] = function() { - return (_Ceil = Module["_Ceil"] = Module["asm"]["O"]).apply(null, arguments); - }; - var _ClipByValue = Module["_ClipByValue"] = function() { - return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["P"]).apply(null, arguments); - }; - var _Conv2D = Module["_Conv2D"] = function() { - return (_Conv2D = Module["_Conv2D"] = Module["asm"]["Q"]).apply(null, arguments); - }; - var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { - return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["R"]).apply(null, arguments); - }; - var _Cos = Module["_Cos"] = function() { - return (_Cos = Module["_Cos"] = Module["asm"]["S"]).apply(null, arguments); - }; - var _Cosh = Module["_Cosh"] = function() { - return (_Cosh = Module["_Cosh"] = Module["asm"]["T"]).apply(null, arguments); - }; - var _CropAndResize = Module["_CropAndResize"] = function() { - return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["U"]).apply(null, arguments); - }; - var _Cumsum = Module["_Cumsum"] = function() { - return (_Cumsum = Module["_Cumsum"] = Module["asm"]["V"]).apply(null, arguments); - }; - var _DepthToSpace = Module["_DepthToSpace"] = function() { - return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["W"]).apply(null, arguments); - }; - var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { - return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["X"]).apply(null, arguments); - }; - var _Elu = Module["_Elu"] = function() { - return (_Elu = Module["_Elu"] = Module["asm"]["Y"]).apply(null, arguments); - }; - var _Equal = Module["_Equal"] = function() { - return (_Equal = Module["_Equal"] = Module["asm"]["Z"]).apply(null, arguments); - }; - var _Exp = Module["_Exp"] = function() { - return (_Exp = Module["_Exp"] = Module["asm"]["_"]).apply(null, arguments); - }; - var _FlipLeftRight = Module["_FlipLeftRight"] = function() { - return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["$"]).apply(null, arguments); - }; - var _Floor = Module["_Floor"] = function() { - return (_Floor = Module["_Floor"] = Module["asm"]["aa"]).apply(null, arguments); - }; - var _FloorDiv = Module["_FloorDiv"] = function() { - return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["ba"]).apply(null, arguments); - }; - var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { - return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["ca"]).apply(null, arguments); - }; - var _FusedConv2D = Module["_FusedConv2D"] = function() { - return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["da"]).apply(null, arguments); - }; - var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { - return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["ea"]).apply(null, arguments); - }; - var _Gather = Module["_Gather"] = function() { - return (_Gather = Module["_Gather"] = Module["asm"]["fa"]).apply(null, arguments); - }; - var _GatherNd = Module["_GatherNd"] = function() { - return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ga"]).apply(null, arguments); - }; - var _Greater = Module["_Greater"] = function() { - return (_Greater = Module["_Greater"] = Module["asm"]["ha"]).apply(null, arguments); - }; - var _GreaterEqual = Module["_GreaterEqual"] = function() { - return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ia"]).apply(null, arguments); - }; - var _LeakyRelu = Module["_LeakyRelu"] = function() { - return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["ja"]).apply(null, arguments); - }; - var _Less = Module["_Less"] = function() { - return (_Less = Module["_Less"] = Module["asm"]["ka"]).apply(null, arguments); - }; - var _LessEqual = Module["_LessEqual"] = function() { - return (_LessEqual = Module["_LessEqual"] = Module["asm"]["la"]).apply(null, arguments); - }; - var _Log = Module["_Log"] = function() { - return (_Log = Module["_Log"] = Module["asm"]["ma"]).apply(null, arguments); - }; - var _LogicalAnd = Module["_LogicalAnd"] = function() { - return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["na"]).apply(null, arguments); - }; - var _Max = Module["_Max"] = function() { - return (_Max = Module["_Max"] = Module["asm"]["oa"]).apply(null, arguments); - }; - var _MaxPool = Module["_MaxPool"] = function() { - return (_MaxPool = Module["_MaxPool"] = Module["asm"]["pa"]).apply(null, arguments); - }; - var _Maximum = Module["_Maximum"] = function() { - return (_Maximum = Module["_Maximum"] = Module["asm"]["qa"]).apply(null, arguments); - }; - var _Mean = Module["_Mean"] = function() { - return (_Mean = Module["_Mean"] = Module["asm"]["ra"]).apply(null, arguments); - }; - var _Min = Module["_Min"] = function() { - return (_Min = Module["_Min"] = Module["asm"]["sa"]).apply(null, arguments); - }; - var _Minimum = Module["_Minimum"] = function() { - return (_Minimum = Module["_Minimum"] = Module["asm"]["ta"]).apply(null, arguments); - }; - var _MirrorPad = Module["_MirrorPad"] = function() { - return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["ua"]).apply(null, arguments); - }; - var _Multiply = Module["_Multiply"] = function() { - return (_Multiply = Module["_Multiply"] = Module["asm"]["va"]).apply(null, arguments); - }; - var _Neg = Module["_Neg"] = function() { - return (_Neg = Module["_Neg"] = Module["asm"]["wa"]).apply(null, arguments); - }; - var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { - return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["xa"]).apply(null, arguments); - }; - var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { - return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ya"]).apply(null, arguments); - }; - var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { - return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["za"]).apply(null, arguments); - }; - var _NotEqual = Module["_NotEqual"] = function() { - return (_NotEqual = Module["_NotEqual"] = Module["asm"]["Aa"]).apply(null, arguments); - }; - var _OneHot = Module["_OneHot"] = function() { - return (_OneHot = Module["_OneHot"] = Module["asm"]["Ba"]).apply(null, arguments); - }; - var _PadV2 = Module["_PadV2"] = function() { - return (_PadV2 = Module["_PadV2"] = Module["asm"]["Ca"]).apply(null, arguments); - }; - var _Pow = Module["_Pow"] = function() { - return (_Pow = Module["_Pow"] = Module["asm"]["Da"]).apply(null, arguments); - }; - var _Prelu = Module["_Prelu"] = function() { - return (_Prelu = Module["_Prelu"] = Module["asm"]["Ea"]).apply(null, arguments); - }; - var _Prod = Module["_Prod"] = function() { - return (_Prod = Module["_Prod"] = Module["asm"]["Fa"]).apply(null, arguments); - }; - var _RealDiv = Module["_RealDiv"] = function() { - return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ga"]).apply(null, arguments); - }; - var _Relu = Module["_Relu"] = function() { - return (_Relu = Module["_Relu"] = Module["asm"]["Ha"]).apply(null, arguments); - }; - var _Relu6 = Module["_Relu6"] = function() { - return (_Relu6 = Module["_Relu6"] = Module["asm"]["Ia"]).apply(null, arguments); - }; - var _ResizeBilinear = Module["_ResizeBilinear"] = function() { - return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ja"]).apply(null, arguments); - }; - var _Reverse = Module["_Reverse"] = function() { - return (_Reverse = Module["_Reverse"] = Module["asm"]["Ka"]).apply(null, arguments); - }; - var _RotateWithOffset = Module["_RotateWithOffset"] = function() { - return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["La"]).apply(null, arguments); - }; - var _Round = Module["_Round"] = function() { - return (_Round = Module["_Round"] = Module["asm"]["Ma"]).apply(null, arguments); - }; - var _Rsqrt = Module["_Rsqrt"] = function() { - return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Na"]).apply(null, arguments); - }; - var _ScatterNd = Module["_ScatterNd"] = function() { - return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Oa"]).apply(null, arguments); - }; - var _SelectV2 = Module["_SelectV2"] = function() { - return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Pa"]).apply(null, arguments); - }; - var _Sigmoid = Module["_Sigmoid"] = function() { - return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["Qa"]).apply(null, arguments); - }; - var _Sin = Module["_Sin"] = function() { - return (_Sin = Module["_Sin"] = Module["asm"]["Ra"]).apply(null, arguments); - }; - var _Softmax = Module["_Softmax"] = function() { - return (_Softmax = Module["_Softmax"] = Module["asm"]["Sa"]).apply(null, arguments); - }; - var _Sqrt = Module["_Sqrt"] = function() { - return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Ta"]).apply(null, arguments); - }; - var _Square = Module["_Square"] = function() { - return (_Square = Module["_Square"] = Module["asm"]["Ua"]).apply(null, arguments); - }; - var _SquaredDifference = Module["_SquaredDifference"] = function() { - return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Va"]).apply(null, arguments); - }; - var _Step = Module["_Step"] = function() { - return (_Step = Module["_Step"] = Module["asm"]["Wa"]).apply(null, arguments); - }; - var _StridedSlice = Module["_StridedSlice"] = function() { - return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Xa"]).apply(null, arguments); - }; - var _Sub = Module["_Sub"] = function() { - return (_Sub = Module["_Sub"] = Module["asm"]["Ya"]).apply(null, arguments); - }; - var _Sum = Module["_Sum"] = function() { - return (_Sum = Module["_Sum"] = Module["asm"]["Za"]).apply(null, arguments); - }; - var _Tan = Module["_Tan"] = function() { - return (_Tan = Module["_Tan"] = Module["asm"]["_a"]).apply(null, arguments); - }; - var _Tanh = Module["_Tanh"] = function() { - return (_Tanh = Module["_Tanh"] = Module["asm"]["$a"]).apply(null, arguments); - }; - var _Tile = Module["_Tile"] = function() { - return (_Tile = Module["_Tile"] = Module["asm"]["ab"]).apply(null, arguments); - }; - var _TopK = Module["_TopK"] = function() { - return (_TopK = Module["_TopK"] = Module["asm"]["bb"]).apply(null, arguments); - }; - var _Transform = Module["_Transform"] = function() { - return (_Transform = Module["_Transform"] = Module["asm"]["cb"]).apply(null, arguments); - }; - var _Transpose = Module["_Transpose"] = function() { - return (_Transpose = Module["_Transpose"] = Module["asm"]["db"]).apply(null, arguments); - }; - var __FusedMatMul = Module["__FusedMatMul"] = function() { - return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["eb"]).apply(null, arguments); - }; - var _malloc = Module["_malloc"] = function() { - return (_malloc = Module["_malloc"] = Module["asm"]["fb"]).apply(null, arguments); - }; - var _free = Module["_free"] = function() { - return (_free = Module["_free"] = Module["asm"]["gb"]).apply(null, arguments); - }; - var ___errno_location = Module["___errno_location"] = function() { - return (___errno_location = Module["___errno_location"] = Module["asm"]["hb"]).apply(null, arguments); - }; - var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { - return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["ib"]).apply(null, arguments); - }; - var _pthread_self = Module["_pthread_self"] = function() { - return (_pthread_self = Module["_pthread_self"] = Module["asm"]["jb"]).apply(null, arguments); - }; - var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { - return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["kb"]).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"]["lb"]).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"]["mb"]).apply(null, arguments); - }; - var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { - return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["nb"]).apply(null, arguments); - }; - var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { - return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["ob"]).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"]["pb"]).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"]["qb"]).apply(null, arguments); - }; - var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { - return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["rb"]).apply(null, arguments); - }; - var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { - return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["sb"]).apply(null, arguments); - }; - var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { - return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["tb"]).apply(null, arguments); - }; - var stackSave = Module["stackSave"] = function() { - return (stackSave = Module["stackSave"] = Module["asm"]["ub"]).apply(null, arguments); - }; - var stackRestore = Module["stackRestore"] = function() { - return (stackRestore = Module["stackRestore"] = Module["asm"]["vb"]).apply(null, arguments); - }; - var stackAlloc = Module["stackAlloc"] = function() { - return (stackAlloc = Module["stackAlloc"] = Module["asm"]["wb"]).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"]["xb"]).apply(null, arguments); - }; - var _memalign = Module["_memalign"] = function() { - return (_memalign = Module["_memalign"] = Module["asm"]["yb"]).apply(null, arguments); - }; - var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 10016; - var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11652; - Module["cwrap"] = cwrap; - 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) { - args = args || arguments_; - 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(); - preMain(); - 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) { - if (implicit && noExitRuntime && status === 0) { - return; - } - if (!implicit) { - if (ENVIRONMENT_IS_PTHREAD) { - postMessage({ "cmd": "exitProcess", "returnCode": status }); - throw new ExitStatus(status); - } else { - } - } - if (noExitRuntime) { - } else { - PThread.terminateAllThreads(); - EXITSTATUS = status; - exitRuntime(); - if (Module["onExit"]) - Module["onExit"](status); - ABORT = true; - } - quit_(status, new ExitStatus(status)); - } - if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") - Module["preInit"] = [Module["preInit"]]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } - } - if (ENVIRONMENT_IS_PTHREAD) { - noExitRuntime = false; - PThread.initWorker(); - } - run(); - return WasmBackendModuleThreadedSimd2.ready; - }; - }(); - if (typeof exports === "object" && typeof module2 === "object") - module2.exports = WasmBackendModuleThreadedSimd; - else if (typeof define === "function" && define["amd"]) - define([], function() { - return WasmBackendModuleThreadedSimd; - }); - else if (typeof exports === "object") - exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; - } - }); - var require_tfjs_backend_wasm = __commonJS({ - "node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.9.0_@tensorflow+tfjs-core@3.9.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(exports, module2) { - var WasmBackendModule = function() { - var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; - if (typeof __filename !== "undefined") - _scriptDir = _scriptDir || __filename; - return function(WasmBackendModule2) { - WasmBackendModule2 = WasmBackendModule2 || {}; - var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; - var readyPromiseResolve, readyPromiseReject; - Module["ready"] = new Promise(function(resolve, reject) { - readyPromiseResolve = resolve; - readyPromiseReject = reject; - }); - var moduleOverrides = {}; - var key; - for (key in Module) { - if (Module.hasOwnProperty(key)) { - moduleOverrides[key] = Module[key]; - } - } - var arguments_ = []; - var thisProgram = "./this.program"; - var quit_ = function(status, toThrow) { - throw toThrow; - }; - var ENVIRONMENT_IS_WEB = false; - var ENVIRONMENT_IS_WORKER = false; - var ENVIRONMENT_IS_NODE = false; - var ENVIRONMENT_IS_SHELL = false; - ENVIRONMENT_IS_WEB = typeof window === "object"; - ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; - ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; - ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - var scriptDirectory = ""; - function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; - } - var read_, readAsync, readBinary, setWindowTitle; - var nodeFS; - var nodePath; - if (ENVIRONMENT_IS_NODE) { - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = require_path().dirname(scriptDirectory) + "/"; - } else { - scriptDirectory = __dirname + "/"; - } - read_ = function shell_read(filename, binary) { - if (!nodeFS) - nodeFS = __require2("fs"); - if (!nodePath) - nodePath = require_path(); - filename = nodePath["normalize"](filename); - return nodeFS["readFileSync"](filename, binary ? null : "utf8"); - }; - readBinary = function readBinary2(filename) { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert3(ret.buffer); - return ret; - }; - 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", abort); - quit_ = function(status) { - process["exit"](status); - }; - Module["inspect"] = function() { - return "[Emscripten Module object]"; - }; - } else if (ENVIRONMENT_IS_SHELL) { - if (typeof read != "undefined") { - read_ = function shell_read(f) { - return read(f); - }; - } - readBinary = function readBinary2(f) { - var data; - if (typeof readbuffer === "function") { - return new Uint8Array(readbuffer(f)); - } - data = read(f, "binary"); - assert3(typeof data === "object"); - return data; - }; - if (typeof scriptArgs != "undefined") { - arguments_ = scriptArgs; - } else if (typeof arguments != "undefined") { - arguments_ = arguments; - } - if (typeof quit === "function") { - quit_ = function(status) { - quit(status); - }; - } - if (typeof print !== "undefined") { - if (typeof console === "undefined") - console = {}; - console.log = print; - console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; - } - } 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.lastIndexOf("/") + 1); - } else { - scriptDirectory = ""; - } - { - read_ = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.send(null); - return xhr.responseText; - }; - if (ENVIRONMENT_IS_WORKER) { - readBinary = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.responseType = "arraybuffer"; - xhr.send(null); - return new Uint8Array(xhr.response); - }; - } - readAsync = function(url, onload, onerror) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, true); - xhr.responseType = "arraybuffer"; - xhr.onload = function() { - if (xhr.status == 200 || xhr.status == 0 && xhr.response) { - onload(xhr.response); - return; - } - onerror(); - }; - xhr.onerror = onerror; - xhr.send(null); - }; - } - setWindowTitle = function(title) { - document.title = title; - }; - } else { - } - var out = Module["print"] || console.log.bind(console); - var err = Module["printErr"] || console.warn.bind(console); - for (key in moduleOverrides) { - if (moduleOverrides.hasOwnProperty(key)) { - Module[key] = moduleOverrides[key]; - } - } - 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; - var EXITSTATUS; - function assert3(condition, text) { - if (!condition) { - abort("Assertion failed: " + text); - } - } - function getCFunc(ident) { - var func2 = Module["_" + ident]; - assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); - return func2; - } - function ccall(ident, returnType, argTypes, args, opts) { - var toC = { "string": function(str) { - var ret2 = 0; - if (str !== null && str !== void 0 && str !== 0) { - var len = (str.length << 2) + 1; - ret2 = stackAlloc(len); - stringToUTF8(str, ret2, len); - } - return ret2; - }, "array": function(arr) { - var ret2 = stackAlloc(arr.length); - writeArrayToMemory(arr, ret2); - return ret2; - } }; - function convertReturnValue(ret2) { - if (returnType === "string") - return UTF8ToString(ret2); - if (returnType === "boolean") - return Boolean(ret2); - return ret2; - } - var func2 = getCFunc(ident); - var cArgs = []; - var stack2 = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack2 === 0) - stack2 = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func2.apply(null, cArgs); - ret = convertReturnValue(ret); - if (stack2 !== 0) - stackRestore(stack2); - return ret; - } - function cwrap(ident, returnType, argTypes, opts) { - argTypes = argTypes || []; - var numericArgs = argTypes.every(function(type) { - return type === "number"; - }); - var numericRet = returnType !== "string"; - if (numericRet && numericArgs && !opts) { - return getCFunc(ident); - } - return function() { - return ccall(ident, returnType, argTypes, arguments, opts); - }; - } - var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; - 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 < endPtr) { - var u0 = heap[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heap[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode((u0 & 31) << 6 | u1); - continue; - } - var u2 = heap[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = (u0 & 15) << 12 | u1 << 6 | u2; - } else { - u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | ch >> 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 < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 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); - } - function writeArrayToMemory(array2, buffer3) { - HEAP8.set(array2, buffer3); - } - function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - x % multiple; - } - return x; - } - var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; - function updateGlobalBufferAndViews(buf) { - buffer2 = 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 __ATMAIN__ = []; - var __ATPOSTRUN__ = []; - var runtimeInitialized = false; - __ATINIT__.push({ func: function() { - ___wasm_call_ctors(); - } }); - 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() { - runtimeInitialized = true; - callRuntimeCallbacks(__ATINIT__); - } - function preMain() { - callRuntimeCallbacks(__ATMAIN__); - } - 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 addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); - } - var runDependencies = 0; - var runDependencyWatcher = null; - 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 (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } - } - Module["preloadedImages"] = {}; - Module["preloadedAudios"] = {}; - function abort(what) { - if (Module["onAbort"]) { - Module["onAbort"](what); - } - what += ""; - err(what); - ABORT = true; - EXITSTATUS = 1; - what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; - } - function hasPrefix(str, prefix) { - return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; - } - var dataURIPrefix = "data:application/octet-stream;base64,"; - function isDataURI(filename) { - return hasPrefix(filename, dataURIPrefix); - } - var fileURIPrefix = "file://"; - function isFileURI(filename) { - return hasPrefix(filename, fileURIPrefix); - } - var 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 (err2) { - abort(err2); - } - } - 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 = { "a": asmLibraryArg }; - function receiveInstance(instance, module22) { - var exports3 = instance.exports; - Module["asm"] = exports3; - wasmMemory = Module["asm"]["i"]; - updateGlobalBufferAndViews(wasmMemory.buffer); - wasmTable = Module["asm"]["o"]; - removeRunDependency("wasm-instantiate"); - } - addRunDependency("wasm-instantiate"); - function receiveInstantiatedSource(output) { - receiveInstance(output["instance"]); - } - function instantiateArrayBuffer(receiver) { - return getBinaryPromise().then(function(binary) { - return WebAssembly.instantiate(binary, info); - }).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(receiveInstantiatedSource, function(reason) { - err("wasm streaming compile failed: " + reason); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(receiveInstantiatedSource); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiatedSource); - } - } - if (Module["instantiateWasm"]) { - try { - var exports2 = Module["instantiateWasm"](info, receiveInstance); - return exports2; - } catch (e) { - err("Module.instantiateWasm callback failed with error: " + e); - return false; - } - } - instantiateAsync().catch(readyPromiseReject); - return {}; - } - function callRuntimeCallbacks(callbacks2) { - while (callbacks2.length > 0) { - var callback = callbacks2.shift(); - if (typeof callback == "function") { - callback(Module); - continue; - } - var func2 = callback.func; - if (typeof func2 === "number") { - if (callback.arg === void 0) { - wasmTable.get(func2)(); - } else { - wasmTable.get(func2)(callback.arg); - } - } else { - func2(callback.arg === void 0 ? null : callback.arg); - } - } - } - function _abort() { - abort(); - } - function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.copyWithin(dest, src, src + num); - } - function _emscripten_get_heap_size() { - return HEAPU8.length; - } - function emscripten_realloc_buffer(size) { - try { - wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); - updateGlobalBufferAndViews(wasmMemory.buffer); - return 1; - } catch (e) { - } - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = _emscripten_get_heap_size(); - var maxHeapSize = 2147483648; - if (requestedSize > maxHeapSize) { - return false; - } - for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { - var overGrownHeapSize = oldSize * (1 + 0.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 buffer3 = SYSCALLS.buffers[stream]; - if (curr === 0 || curr === 10) { - (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); - buffer3.length = 0; - } else { - buffer3.push(curr); - } - }, varargs: void 0, 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 < iovcnt; i++) { - var ptr = HEAP32[iov + i * 8 >> 2]; - var len = HEAP32[iov + (i * 8 + 4) >> 2]; - for (var j = 0; j < len; j++) { - SYSCALLS.printChar(fd, HEAPU8[ptr + j]); - } - num += len; - } - HEAP32[pnum >> 2] = num; - return 0; - } - function _pthread_create() { - return 6; - } - function setErrNo(value) { - HEAP32[___errno_location() >> 2] = value; - return value; - } - function _sysconf(name) { - switch (name) { - case 30: - return 16384; - case 85: - var maxHeapSize = 2147483648; - return maxHeapSize / 16384; - case 132: - case 133: - case 12: - case 137: - case 138: - case 15: - case 235: - case 16: - case 17: - case 18: - case 19: - case 20: - case 149: - case 13: - case 10: - case 236: - case 153: - case 9: - case 21: - case 22: - case 159: - case 154: - case 14: - case 77: - case 78: - case 139: - case 82: - case 68: - case 67: - case 164: - case 11: - case 29: - case 47: - case 48: - case 95: - case 52: - case 51: - case 46: - return 200809; - case 27: - case 246: - case 127: - case 128: - case 23: - case 24: - case 160: - case 161: - case 181: - case 182: - case 242: - case 183: - case 184: - case 243: - case 244: - case 245: - case 165: - case 178: - case 179: - case 49: - case 50: - case 168: - case 169: - case 175: - case 170: - case 171: - case 172: - case 97: - case 76: - case 32: - case 173: - case 35: - case 80: - case 81: - case 79: - return -1; - case 176: - case 177: - case 7: - case 155: - case 8: - case 157: - case 125: - case 126: - case 92: - case 93: - case 129: - case 130: - case 131: - case 94: - case 91: - return 1; - case 74: - case 60: - case 69: - case 70: - case 4: - return 1024; - case 31: - case 42: - case 72: - return 32; - case 87: - case 26: - case 33: - return 2147483647; - case 34: - case 1: - return 47839; - case 38: - case 36: - return 99; - case 43: - case 37: - return 2048; - case 0: - return 2097152; - case 3: - return 65536; - case 28: - return 32768; - case 44: - return 32767; - case 75: - return 16384; - case 39: - return 1e3; - case 89: - return 700; - case 71: - return 256; - case 40: - return 255; - case 2: - return 100; - case 180: - return 64; - case 25: - return 20; - case 5: - return 16; - case 6: - return 6; - case 73: - return 4; - case 84: { - if (typeof navigator === "object") - return navigator["hardwareConcurrency"] || 1; - return 1; - } - } - setErrNo(28); - return -1; - } - var asmLibraryArg = { "a": _abort, "d": _emscripten_memcpy_big, "e": _emscripten_resize_heap, "f": _fd_close, "c": _fd_seek, "b": _fd_write, "g": _pthread_create, "h": _sysconf }; - var asm = createWasm(); - var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { - return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["j"]).apply(null, arguments); - }; - var _init = Module["_init"] = function() { - return (_init = Module["_init"] = Module["asm"]["k"]).apply(null, arguments); - }; - var _register_tensor = Module["_register_tensor"] = function() { - return (_register_tensor = Module["_register_tensor"] = Module["asm"]["l"]).apply(null, arguments); - }; - var _dispose_data = Module["_dispose_data"] = function() { - return (_dispose_data = Module["_dispose_data"] = Module["asm"]["m"]).apply(null, arguments); - }; - var _dispose = Module["_dispose"] = function() { - return (_dispose = Module["_dispose"] = Module["asm"]["n"]).apply(null, arguments); - }; - var _Abs = Module["_Abs"] = function() { - return (_Abs = Module["_Abs"] = Module["asm"]["p"]).apply(null, arguments); - }; - var _Add = Module["_Add"] = function() { - return (_Add = Module["_Add"] = Module["asm"]["q"]).apply(null, arguments); - }; - var _AddN = Module["_AddN"] = function() { - return (_AddN = Module["_AddN"] = Module["asm"]["r"]).apply(null, arguments); - }; - var _All = Module["_All"] = function() { - return (_All = Module["_All"] = Module["asm"]["s"]).apply(null, arguments); - }; - var _Any = Module["_Any"] = function() { - return (_Any = Module["_Any"] = Module["asm"]["t"]).apply(null, arguments); - }; - var _ArgMax = Module["_ArgMax"] = function() { - return (_ArgMax = Module["_ArgMax"] = Module["asm"]["u"]).apply(null, arguments); - }; - var _AvgPool = Module["_AvgPool"] = function() { - return (_AvgPool = Module["_AvgPool"] = Module["asm"]["v"]).apply(null, arguments); - }; - var _BatchMatMul = Module["_BatchMatMul"] = function() { - return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["w"]).apply(null, arguments); - }; - var _Ceil = Module["_Ceil"] = function() { - return (_Ceil = Module["_Ceil"] = Module["asm"]["x"]).apply(null, arguments); - }; - var _ClipByValue = Module["_ClipByValue"] = function() { - return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["y"]).apply(null, arguments); - }; - var _Conv2D = Module["_Conv2D"] = function() { - return (_Conv2D = Module["_Conv2D"] = Module["asm"]["z"]).apply(null, arguments); - }; - var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { - return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["A"]).apply(null, arguments); - }; - var _Cos = Module["_Cos"] = function() { - return (_Cos = Module["_Cos"] = Module["asm"]["B"]).apply(null, arguments); - }; - var _Cosh = Module["_Cosh"] = function() { - return (_Cosh = Module["_Cosh"] = Module["asm"]["C"]).apply(null, arguments); - }; - var _CropAndResize = Module["_CropAndResize"] = function() { - return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["D"]).apply(null, arguments); - }; - var _Cumsum = Module["_Cumsum"] = function() { - return (_Cumsum = Module["_Cumsum"] = Module["asm"]["E"]).apply(null, arguments); - }; - var _DepthToSpace = Module["_DepthToSpace"] = function() { - return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["F"]).apply(null, arguments); - }; - var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { - return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["G"]).apply(null, arguments); - }; - var _Elu = Module["_Elu"] = function() { - return (_Elu = Module["_Elu"] = Module["asm"]["H"]).apply(null, arguments); - }; - var _Equal = Module["_Equal"] = function() { - return (_Equal = Module["_Equal"] = Module["asm"]["I"]).apply(null, arguments); - }; - var _Exp = Module["_Exp"] = function() { - return (_Exp = Module["_Exp"] = Module["asm"]["J"]).apply(null, arguments); - }; - var _FlipLeftRight = Module["_FlipLeftRight"] = function() { - return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["K"]).apply(null, arguments); - }; - var _Floor = Module["_Floor"] = function() { - return (_Floor = Module["_Floor"] = Module["asm"]["L"]).apply(null, arguments); - }; - var _FloorDiv = Module["_FloorDiv"] = function() { - return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["M"]).apply(null, arguments); - }; - var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { - return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["N"]).apply(null, arguments); - }; - var _FusedConv2D = Module["_FusedConv2D"] = function() { - return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["O"]).apply(null, arguments); - }; - var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { - return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["P"]).apply(null, arguments); - }; - var _Gather = Module["_Gather"] = function() { - return (_Gather = Module["_Gather"] = Module["asm"]["Q"]).apply(null, arguments); - }; - var _GatherNd = Module["_GatherNd"] = function() { - return (_GatherNd = Module["_GatherNd"] = Module["asm"]["R"]).apply(null, arguments); - }; - var _Greater = Module["_Greater"] = function() { - return (_Greater = Module["_Greater"] = Module["asm"]["S"]).apply(null, arguments); - }; - var _GreaterEqual = Module["_GreaterEqual"] = function() { - return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["T"]).apply(null, arguments); - }; - var _LeakyRelu = Module["_LeakyRelu"] = function() { - return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["U"]).apply(null, arguments); - }; - var _Less = Module["_Less"] = function() { - return (_Less = Module["_Less"] = Module["asm"]["V"]).apply(null, arguments); - }; - var _LessEqual = Module["_LessEqual"] = function() { - return (_LessEqual = Module["_LessEqual"] = Module["asm"]["W"]).apply(null, arguments); - }; - var _Log = Module["_Log"] = function() { - return (_Log = Module["_Log"] = Module["asm"]["X"]).apply(null, arguments); - }; - var _LogicalAnd = Module["_LogicalAnd"] = function() { - return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["Y"]).apply(null, arguments); - }; - var _Max = Module["_Max"] = function() { - return (_Max = Module["_Max"] = Module["asm"]["Z"]).apply(null, arguments); - }; - var _MaxPool = Module["_MaxPool"] = function() { - return (_MaxPool = Module["_MaxPool"] = Module["asm"]["_"]).apply(null, arguments); - }; - var _Maximum = Module["_Maximum"] = function() { - return (_Maximum = Module["_Maximum"] = Module["asm"]["$"]).apply(null, arguments); - }; - var _Mean = Module["_Mean"] = function() { - return (_Mean = Module["_Mean"] = Module["asm"]["aa"]).apply(null, arguments); - }; - var _Min = Module["_Min"] = function() { - return (_Min = Module["_Min"] = Module["asm"]["ba"]).apply(null, arguments); - }; - var _Minimum = Module["_Minimum"] = function() { - return (_Minimum = Module["_Minimum"] = Module["asm"]["ca"]).apply(null, arguments); - }; - var _MirrorPad = Module["_MirrorPad"] = function() { - return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["da"]).apply(null, arguments); - }; - var _Multiply = Module["_Multiply"] = function() { - return (_Multiply = Module["_Multiply"] = Module["asm"]["ea"]).apply(null, arguments); - }; - var _Neg = Module["_Neg"] = function() { - return (_Neg = Module["_Neg"] = Module["asm"]["fa"]).apply(null, arguments); - }; - var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { - return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["ga"]).apply(null, arguments); - }; - var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { - return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ha"]).apply(null, arguments); - }; - var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { - return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ia"]).apply(null, arguments); - }; - var _NotEqual = Module["_NotEqual"] = function() { - return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ja"]).apply(null, arguments); - }; - var _OneHot = Module["_OneHot"] = function() { - return (_OneHot = Module["_OneHot"] = Module["asm"]["ka"]).apply(null, arguments); - }; - var _PadV2 = Module["_PadV2"] = function() { - return (_PadV2 = Module["_PadV2"] = Module["asm"]["la"]).apply(null, arguments); - }; - var _Pow = Module["_Pow"] = function() { - return (_Pow = Module["_Pow"] = Module["asm"]["ma"]).apply(null, arguments); - }; - var _Prelu = Module["_Prelu"] = function() { - return (_Prelu = Module["_Prelu"] = Module["asm"]["na"]).apply(null, arguments); - }; - var _Prod = Module["_Prod"] = function() { - return (_Prod = Module["_Prod"] = Module["asm"]["oa"]).apply(null, arguments); - }; - var _RealDiv = Module["_RealDiv"] = function() { - return (_RealDiv = Module["_RealDiv"] = Module["asm"]["pa"]).apply(null, arguments); - }; - var _Relu = Module["_Relu"] = function() { - return (_Relu = Module["_Relu"] = Module["asm"]["qa"]).apply(null, arguments); - }; - var _Relu6 = Module["_Relu6"] = function() { - return (_Relu6 = Module["_Relu6"] = Module["asm"]["ra"]).apply(null, arguments); - }; - var _ResizeBilinear = Module["_ResizeBilinear"] = function() { - return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["sa"]).apply(null, arguments); - }; - var _Reverse = Module["_Reverse"] = function() { - return (_Reverse = Module["_Reverse"] = Module["asm"]["ta"]).apply(null, arguments); - }; - var _RotateWithOffset = Module["_RotateWithOffset"] = function() { - return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["ua"]).apply(null, arguments); - }; - var _Round = Module["_Round"] = function() { - return (_Round = Module["_Round"] = Module["asm"]["va"]).apply(null, arguments); - }; - var _Rsqrt = Module["_Rsqrt"] = function() { - return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["wa"]).apply(null, arguments); - }; - var _ScatterNd = Module["_ScatterNd"] = function() { - return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["xa"]).apply(null, arguments); - }; - var _SelectV2 = Module["_SelectV2"] = function() { - return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["ya"]).apply(null, arguments); - }; - var _Sigmoid = Module["_Sigmoid"] = function() { - return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["za"]).apply(null, arguments); - }; - var _Sin = Module["_Sin"] = function() { - return (_Sin = Module["_Sin"] = Module["asm"]["Aa"]).apply(null, arguments); - }; - var _Softmax = Module["_Softmax"] = function() { - return (_Softmax = Module["_Softmax"] = Module["asm"]["Ba"]).apply(null, arguments); - }; - var _Sqrt = Module["_Sqrt"] = function() { - return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Ca"]).apply(null, arguments); - }; - var _Square = Module["_Square"] = function() { - return (_Square = Module["_Square"] = Module["asm"]["Da"]).apply(null, arguments); - }; - var _SquaredDifference = Module["_SquaredDifference"] = function() { - return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Ea"]).apply(null, arguments); - }; - var _Step = Module["_Step"] = function() { - return (_Step = Module["_Step"] = Module["asm"]["Fa"]).apply(null, arguments); - }; - var _StridedSlice = Module["_StridedSlice"] = function() { - return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Ga"]).apply(null, arguments); - }; - var _Sub = Module["_Sub"] = function() { - return (_Sub = Module["_Sub"] = Module["asm"]["Ha"]).apply(null, arguments); - }; - var _Sum = Module["_Sum"] = function() { - return (_Sum = Module["_Sum"] = Module["asm"]["Ia"]).apply(null, arguments); - }; - var _Tan = Module["_Tan"] = function() { - return (_Tan = Module["_Tan"] = Module["asm"]["Ja"]).apply(null, arguments); - }; - var _Tanh = Module["_Tanh"] = function() { - return (_Tanh = Module["_Tanh"] = Module["asm"]["Ka"]).apply(null, arguments); - }; - var _Tile = Module["_Tile"] = function() { - return (_Tile = Module["_Tile"] = Module["asm"]["La"]).apply(null, arguments); - }; - var _TopK = Module["_TopK"] = function() { - return (_TopK = Module["_TopK"] = Module["asm"]["Ma"]).apply(null, arguments); - }; - var _Transform = Module["_Transform"] = function() { - return (_Transform = Module["_Transform"] = Module["asm"]["Na"]).apply(null, arguments); - }; - var _Transpose = Module["_Transpose"] = function() { - return (_Transpose = Module["_Transpose"] = Module["asm"]["Oa"]).apply(null, arguments); - }; - var __FusedMatMul = Module["__FusedMatMul"] = function() { - return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Pa"]).apply(null, arguments); - }; - var _malloc = Module["_malloc"] = function() { - return (_malloc = Module["_malloc"] = Module["asm"]["Qa"]).apply(null, arguments); - }; - var _free = Module["_free"] = function() { - return (_free = Module["_free"] = Module["asm"]["Ra"]).apply(null, arguments); - }; - var ___errno_location = Module["___errno_location"] = function() { - return (___errno_location = Module["___errno_location"] = Module["asm"]["Sa"]).apply(null, arguments); - }; - var stackSave = Module["stackSave"] = function() { - return (stackSave = Module["stackSave"] = Module["asm"]["Ta"]).apply(null, arguments); - }; - var stackRestore = Module["stackRestore"] = function() { - return (stackRestore = Module["stackRestore"] = Module["asm"]["Ua"]).apply(null, arguments); - }; - var stackAlloc = Module["stackAlloc"] = function() { - return (stackAlloc = Module["stackAlloc"] = Module["asm"]["Va"]).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) { - args = args || arguments_; - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) - return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) - return; - initRuntime(); - preMain(); - 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(); - return WasmBackendModule2.ready; - }; - }(); - if (typeof exports === "object" && typeof module2 === "object") - module2.exports = WasmBackendModule; - else if (typeof define === "function" && define["amd"]) - define([], function() { - return WasmBackendModule; - }); - else if (typeof exports === "object") - exports["WasmBackendModule"] = WasmBackendModule; - } - }); - var version = "3.9.0"; - var version2 = "3.9.0"; - var version3 = "3.9.0"; - var version4 = "3.9.0"; - var version5 = "3.9.0"; - var version6 = "3.9.0"; - var version7 = "3.9.0"; - var version8 = "3.9.0"; - var EPSILON_FLOAT32 = 1e-7; - var EPSILON_FLOAT16 = 1e-4; - var DataStorage = class { - constructor(backend2, dataMover) { - this.backend = backend2; - this.dataMover = dataMover; - this.data = new WeakMap(); - this.dataIdsCount = 0; - } - get(dataId) { - if (!this.data.has(dataId)) { - this.dataMover.moveData(this.backend, dataId); - } - return this.data.get(dataId); - } - set(dataId, value) { - this.dataIdsCount++; - this.data.set(dataId, value); - } - has(dataId) { - return this.data.has(dataId); - } - delete(dataId) { - this.dataIdsCount--; - return this.data.delete(dataId); - } - numDataIds() { - return this.dataIdsCount; - } - }; - var KernelBackend = class { - refCount(dataId) { - return notYetImplemented("refCount"); - } - incRef(dataId) { - return notYetImplemented("incRef"); - } - timerAvailable() { - return true; - } - time(f) { - return notYetImplemented("time"); - } - read(dataId) { - return notYetImplemented("read"); - } - readSync(dataId) { - return notYetImplemented("readSync"); - } - numDataIds() { - return notYetImplemented("numDataIds"); - } - disposeData(dataId, force) { - return notYetImplemented("disposeData"); - } - write(values, shape, dtype) { - return notYetImplemented("write"); - } - move(dataId, values, shape, dtype, refCount) { - return notYetImplemented("move"); - } - memory() { - return notYetImplemented("memory"); - } - floatPrecision() { - return notYetImplemented("floatPrecision"); - } - epsilon() { - return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; - } - dispose() { - return notYetImplemented("dispose"); - } - }; - function notYetImplemented(kernelName) { - throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); - } - function shuffle(array2) { - let counter = array2.length; - let index = 0; - while (counter > 0) { - index = Math.random() * counter | 0; - counter--; - swap(array2, counter, index); - } - } - function shuffleCombo(array2, array22) { - if (array2.length !== array22.length) { - throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); - } - let counter = array2.length; - let index = 0; - while (counter > 0) { - index = Math.random() * counter | 0; - counter--; - swap(array2, counter, index); - swap(array22, counter, index); - } - } - function clamp(min6, x, max6) { - return Math.max(min6, Math.min(x, max6)); - } - function nearestLargerEven(val) { - return val % 2 === 0 ? val : val + 1; - } - function swap(object, left, right) { - const temp = object[left]; - object[left] = object[right]; - object[right] = temp; - } - function sum(arr) { - let sum6 = 0; - for (let i = 0; i < arr.length; i++) { - sum6 += arr[i]; - } - return sum6; - } - function randUniform(a, b) { - const r = Math.random(); - return b * r + (1 - r) * a; - } - function distSquared(a, b) { - let result = 0; - for (let i = 0; i < a.length; i++) { - const diff = Number(a[i]) - Number(b[i]); - result += diff * diff; - } - return result; - } - function assert(expr, msg) { - if (!expr) { - throw new Error(typeof msg === "string" ? msg : msg()); - } - } - function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { - assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); - } - function assertNonNull(a) { - assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); - } - function flatten(arr, result = [], skipTypedArray = false) { - if (result == null) { - result = []; - } - if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { - for (let i = 0; i < arr.length; ++i) { - flatten(arr[i], result, skipTypedArray); - } - } else { - result.push(arr); - } - return result; - } - function sizeFromShape(shape) { - if (shape.length === 0) { - return 1; - } - let size = shape[0]; - for (let i = 1; i < shape.length; i++) { - size *= shape[i]; - } - return size; - } - function isScalarShape(shape) { - return shape.length === 0; - } - function arraysEqual(n1, n2) { - if (n1 === n2) { - return true; - } - if (n1 == null || n2 == null) { - return false; - } - if (n1.length !== n2.length) { - return false; - } - for (let i = 0; i < n1.length; i++) { - if (n1[i] !== n2[i]) { - return false; - } - } - return true; - } - function isInt(a) { - return a % 1 === 0; - } - function tanh(x) { - if (Math.tanh != null) { - return Math.tanh(x); - } - if (x === Infinity) { - return 1; - } else if (x === -Infinity) { - return -1; - } else { - const e2x = Math.exp(2 * x); - return (e2x - 1) / (e2x + 1); - } - } - function sizeToSquarishShape(size) { - const width = Math.ceil(Math.sqrt(size)); - return [width, Math.ceil(size / width)]; - } - function createShuffledIndices(n) { - const shuffledIndices = new Uint32Array(n); - for (let i = 0; i < n; ++i) { - shuffledIndices[i] = i; - } - shuffle(shuffledIndices); - return shuffledIndices; - } - function rightPad(a, size) { - if (size <= a.length) { - return a; - } - return a + " ".repeat(size - a.length); - } - function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { - return new Promise((resolve, reject) => { - let tryCount = 0; - const tryFn = () => { - if (checkFn()) { - resolve(); - return; - } - tryCount++; - const nextBackoff = delayFn(tryCount); - if (maxCounter != null && tryCount >= maxCounter) { - reject(); - return; - } - setTimeout(tryFn, nextBackoff); - }; - tryFn(); - }); - } - function inferFromImplicitShape(shape, size) { - let shapeProd = 1; - let implicitIdx = -1; - for (let i = 0; i < shape.length; ++i) { - if (shape[i] >= 0) { - shapeProd *= shape[i]; - } else if (shape[i] === -1) { - if (implicitIdx !== -1) { - throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); - } - implicitIdx = i; - } else if (shape[i] < 0) { - throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); - } - } - if (implicitIdx === -1) { - if (size > 0 && size !== shapeProd) { - throw Error(`Size(${size}) must match the product of shape ${shape}`); - } - return shape; - } - if (shapeProd === 0) { - throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); - } - if (size % shapeProd !== 0) { - throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); - } - const newShape = shape.slice(); - newShape[implicitIdx] = size / shapeProd; - return newShape; - } - function parseAxisParam(axis, shape) { - const rank = shape.length; - axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); - assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); - assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); - return axis.map((a) => a < 0 ? rank + a : a); - } - function squeezeShape(shape, axis) { - const newShape = []; - const keptDims = []; - const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; - const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); - let j = 0; - for (let i = 0; i < shape.length; ++i) { - if (axes != null) { - if (axes[j] === i && shape[i] !== 1) { - throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); - } - if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { - newShape.push(shape[i]); - keptDims.push(i); - } - if (axes[j] <= i) { - j++; - } - } - if (shape[i] !== 1) { - newShape.push(shape[i]); - keptDims.push(i); - } - } - return { newShape, keptDims }; - } - function getTypedArrayFromDType(dtype, size) { - let values = null; - if (dtype == null || dtype === "float32") { - values = new Float32Array(size); - } else if (dtype === "int32") { - values = new Int32Array(size); - } else if (dtype === "bool") { - values = new Uint8Array(size); - } else { - throw new Error(`Unknown data type ${dtype}`); - } - return values; - } - function getArrayFromDType(dtype, size) { - let values = null; - if (dtype == null || dtype === "float32") { - values = new Float32Array(size); - } else if (dtype === "int32") { - values = new Int32Array(size); - } else if (dtype === "bool") { - values = new Uint8Array(size); - } else if (dtype === "string") { - values = new Array(size); - } else { - throw new Error(`Unknown data type ${dtype}`); - } - return values; - } - function checkConversionForErrors(vals, dtype) { - for (let i = 0; i < vals.length; i++) { - const num = vals[i]; - if (isNaN(num) || !isFinite(num)) { - throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); - } - } - } - function isValidDtype(dtype) { - return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; - } - function hasEncodingLoss(oldType, newType) { - if (newType === "complex64") { - return false; - } - if (newType === "float32" && oldType !== "complex64") { - return false; - } - if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { - return false; - } - if (newType === "bool" && oldType === "bool") { - return false; - } - return true; - } - function isTypedArray(a) { - return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; - } - function bytesPerElement(dtype) { - if (dtype === "float32" || dtype === "int32") { - return 4; - } else if (dtype === "complex64") { - return 8; - } else if (dtype === "bool") { - return 1; - } else { - throw new Error(`Unknown dtype ${dtype}`); - } - } - function bytesFromStringArray(arr) { - if (arr == null) { - return 0; - } - let bytes = 0; - arr.forEach((x) => bytes += x.length); - return bytes; - } - function isString(value) { - return typeof value === "string" || value instanceof String; - } - function isBoolean(value) { - return typeof value === "boolean"; - } - function isNumber(value) { - return typeof value === "number"; - } - function inferDtype(values) { - if (Array.isArray(values)) { - return inferDtype(values[0]); - } - if (values instanceof Float32Array) { - return "float32"; - } else if (values instanceof Int32Array || values instanceof Uint8Array) { - return "int32"; - } else if (isNumber(values)) { - return "float32"; - } else if (isString(values)) { - return "string"; - } else if (isBoolean(values)) { - return "bool"; - } - return "float32"; - } - function isFunction(f) { - return !!(f && f.constructor && f.call && f.apply); - } - function nearestDivisor(size, start) { - for (let i = start; i < size; ++i) { - if (size % i === 0) { - return i; - } - } - return size; - } - function computeStrides(shape) { - const rank = shape.length; - if (rank < 2) { - return []; - } - const strides = new Array(rank - 1); - strides[rank - 2] = shape[rank - 1]; - for (let i = rank - 3; i >= 0; --i) { - strides[i] = strides[i + 1] * shape[i + 1]; - } - return strides; - } - function createNestedArray(offset, shape, a, isComplex = false) { - const ret = new Array(); - if (shape.length === 1) { - const d = shape[0] * (isComplex ? 2 : 1); - for (let i = 0; i < d; i++) { - ret[i] = a[offset + i]; - } - } else { - const d = shape[0]; - const rest = shape.slice(1); - const len = rest.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1); - for (let i = 0; i < d; i++) { - ret[i] = createNestedArray(offset + i * len, rest, a, isComplex); - } - } - return ret; - } - function toNestedArray(shape, a, isComplex = false) { - if (shape.length === 0) { - return a[0]; - } - const size = shape.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1); - if (size === 0) { - return []; - } - if (size !== a.length) { - throw new Error(`[${shape}] does not match the input size ${a.length}${isComplex ? " for a complex tensor" : ""}.`); - } - return createNestedArray(0, shape, a, isComplex); - } - function makeOnesTypedArray(size, dtype) { - const array2 = makeZerosTypedArray(size, dtype); - for (let i = 0; i < array2.length; i++) { - array2[i] = 1; - } - return array2; - } - function makeZerosTypedArray(size, dtype) { - if (dtype == null || dtype === "float32" || dtype === "complex64") { - return new Float32Array(size); - } else if (dtype === "int32") { - return new Int32Array(size); - } else if (dtype === "bool") { - return new Uint8Array(size); - } else { - throw new Error(`Unknown data type ${dtype}`); - } - } - function makeZerosNestedTypedArray(shape, dtype) { - const size = shape.reduce((prev, curr) => prev * curr, 1); - if (dtype == null || dtype === "float32") { - return toNestedArray(shape, new Float32Array(size)); - } else if (dtype === "int32") { - return toNestedArray(shape, new Int32Array(size)); - } else if (dtype === "bool") { - return toNestedArray(shape, new Uint8Array(size)); - } else { - throw new Error(`Unknown data type ${dtype}`); - } - } - function assertNonNegativeIntegerDimensions(shape) { - shape.forEach((dimSize) => { - assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); - }); - } - function locToIndex(locs, rank, strides) { - if (rank === 0) { - return 0; - } else if (rank === 1) { - return locs[0]; - } - let index = locs[locs.length - 1]; - for (let i = 0; i < locs.length - 1; ++i) { - index += strides[i] * locs[i]; - } - return index; - } - function indexToLoc(index, rank, strides) { - if (rank === 0) { - return []; - } else if (rank === 1) { - return [index]; - } - const locs = new Array(rank); - for (let i = 0; i < locs.length - 1; ++i) { - locs[i] = Math.floor(index / strides[i]); - index -= locs[i] * strides[i]; - } - locs[locs.length - 1] = index; - return locs; - } - function isPromise(object) { - return object && object.then && typeof object.then === "function"; - } - function warn(...msg) { - if (!(env().getBool("IS_TEST") || env().getBool("PROD"))) { - console.warn(...msg); - } - } - function log(...msg) { - if (!(env().getBool("IS_TEST") || env().getBool("PROD"))) { - console.log(...msg); - } - } - var TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; - var Environment = class { - constructor(global2) { - this.global = global2; - this.flags = {}; - this.flagRegistry = {}; - this.urlFlags = {}; - this.getQueryParams = getQueryParams; - this.populateURLFlags(); - } - setPlatform(platformName, platform) { - if (this.platform != null) { - warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); - } - this.platformName = platformName; - this.platform = platform; - } - registerFlag(flagName, evaluationFn, setHook) { - this.flagRegistry[flagName] = { evaluationFn, setHook }; - if (this.urlFlags[flagName] != null) { - const flagValue = this.urlFlags[flagName]; - warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); - this.set(flagName, flagValue); - } - } - async getAsync(flagName) { - if (flagName in this.flags) { - return this.flags[flagName]; - } - this.flags[flagName] = await this.evaluateFlag(flagName); - return this.flags[flagName]; - } - get(flagName) { - if (flagName in this.flags) { - return this.flags[flagName]; - } - const flagValue = this.evaluateFlag(flagName); - if (isPromise(flagValue)) { - throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); - } - this.flags[flagName] = flagValue; - return this.flags[flagName]; - } - getNumber(flagName) { - return this.get(flagName); - } - getBool(flagName) { - return this.get(flagName); - } - getFlags() { - return this.flags; - } - get features() { - return this.flags; - } - set(flagName, value) { - if (this.flagRegistry[flagName] == null) { - throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); - } - this.flags[flagName] = value; - if (this.flagRegistry[flagName].setHook != null) { - this.flagRegistry[flagName].setHook(value); - } - } - evaluateFlag(flagName) { - if (this.flagRegistry[flagName] == null) { - throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); - } - return this.flagRegistry[flagName].evaluationFn(); - } - setFlags(flags) { - this.flags = Object.assign({}, flags); - } - reset() { - this.flags = {}; - this.urlFlags = {}; - this.populateURLFlags(); - } - populateURLFlags() { - if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { - return; - } - const urlParams = this.getQueryParams(this.global.location.search); - if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { - const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); - keyValues.forEach((keyValue) => { - const [key, value] = keyValue.split(":"); - this.urlFlags[key] = parseValue(key, value); - }); - } - } - }; - function getQueryParams(queryString) { - const params = {}; - queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { - decodeParam(params, t[0], t[1]); - return t.join("="); - }); - return params; - } - function decodeParam(params, name, value) { - params[decodeURIComponent(name)] = decodeURIComponent(value || ""); - } - function parseValue(flagName, value) { - value = value.toLowerCase(); - if (value === "true" || value === "false") { - return value === "true"; - } else if (`${+value}` === value) { - return +value; - } - throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); - } - function env() { - return ENV; - } - var ENV = null; - function setEnvironmentGlobal(environment2) { - ENV = environment2; - } - var globalNameSpace; - function getGlobalNamespace() { - if (globalNameSpace == null) { - let ns; - if (typeof window !== "undefined") { - ns = window; - } else if (typeof global !== "undefined") { - ns = global; - } else if (typeof process !== "undefined") { - ns = process; - } else if (typeof self !== "undefined") { - ns = self; - } else { - throw new Error("Could not find a global object"); - } - globalNameSpace = ns; - } - return globalNameSpace; - } - function getGlobalMap() { - const ns = getGlobalNamespace(); - if (ns._tfGlobals == null) { - ns._tfGlobals = new Map(); - } - return ns._tfGlobals; - } - function getGlobal(key, init2) { - const globalMap = getGlobalMap(); - if (globalMap.has(key)) { - return globalMap.get(key); - } else { - const singleton = init2(); - globalMap.set(key, singleton); - return globalMap.get(key); - } - } - var Abs = "Abs"; - var Acos = "Acos"; - var Acosh = "Acosh"; - var Add = "Add"; - var AddN = "AddN"; - var All = "All"; - var Any = "Any"; - var ArgMax = "ArgMax"; - var ArgMin = "ArgMin"; - var Asin = "Asin"; - var Asinh = "Asinh"; - var Atan = "Atan"; - var Atanh = "Atanh"; - var Atan2 = "Atan2"; - var AvgPool = "AvgPool"; - var AvgPoolGrad = "AvgPoolGrad"; - var AvgPool3D = "AvgPool3D"; - var AvgPool3DGrad = "AvgPool3DGrad"; - var BatchMatMul = "BatchMatMul"; - var BatchToSpaceND = "BatchToSpaceND"; - var Bincount = "Bincount"; - var BroadcastTo = "BroadcastTo"; - var BroadcastArgs = "BroadcastArgs"; - var Cast = "Cast"; - var Ceil = "Ceil"; - var ClipByValue = "ClipByValue"; - var Complex = "Complex"; - var ComplexAbs = "ComplexAbs"; - var Concat = "Concat"; - var Conv2D = "Conv2D"; - var Conv2DBackpropFilter = "Conv2DBackpropFilter"; - var Conv2DBackpropInput = "Conv2DBackpropInput"; - var Conv3D = "Conv3D"; - var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; - var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; - var Cos = "Cos"; - var Cosh = "Cosh"; - var Cumsum = "Cumsum"; - var CropAndResize = "CropAndResize"; - var DenseBincount = "DenseBincount"; - var DepthToSpace = "DepthToSpace"; - var DepthwiseConv2dNative = "DepthwiseConv2dNative"; - var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; - var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; - var Diag = "Diag"; - var Dilation2D = "Dilation2D"; - var Dilation2DBackpropInput = "Dilation2DBackpropInput"; - var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; - var RealDiv = "RealDiv"; - var Einsum = "Einsum"; - var Elu = "Elu"; - var EluGrad = "EluGrad"; - var Erf = "Erf"; - var Equal = "Equal"; - var Exp = "Exp"; - var ExpandDims = "ExpandDims"; - var Expm1 = "Expm1"; - var FFT = "FFT"; - var Fill = "Fill"; - var FlipLeftRight = "FlipLeftRight"; - var Floor = "Floor"; - var FloorDiv = "FloorDiv"; - var FusedBatchNorm = "FusedBatchNorm"; - var GatherV2 = "GatherV2"; - var GatherNd = "GatherNd"; - var Greater = "Greater"; - var GreaterEqual = "GreaterEqual"; - var Identity = "Identity"; - var IFFT = "IFFT"; - var Imag = "Imag"; - var IsFinite = "IsFinite"; - var IsInf = "IsInf"; - var IsNan = "IsNan"; - var LeakyRelu = "LeakyRelu"; - var Less = "Less"; - var LessEqual = "LessEqual"; - var LinSpace = "LinSpace"; - var Log = "Log"; - var Log1p = "Log1p"; - var LogicalAnd = "LogicalAnd"; - var LogicalNot = "LogicalNot"; - var LogicalOr = "LogicalOr"; - var LogSoftmax = "LogSoftmax"; - var LRN = "LRN"; - var LRNGrad = "LRNGrad"; - var Max = "Max"; - var Maximum = "Maximum"; - var MaxPool = "MaxPool"; - var MaxPoolGrad = "MaxPoolGrad"; - var MaxPool3D = "MaxPool3D"; - var MaxPool3DGrad = "MaxPool3DGrad"; - var MaxPoolWithArgmax = "MaxPoolWithArgmax"; - var Mean = "Mean"; - var Min = "Min"; - var Minimum = "Minimum"; - var MirrorPad = "MirrorPad"; - var Mod = "Mod"; - var Multinomial = "Multinomial"; - var Multiply = "Multiply"; - var Neg = "Neg"; - var NotEqual = "NotEqual"; - var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; - var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; - var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; - var OnesLike = "OnesLike"; - var OneHot = "OneHot"; - var Pack = "Pack"; - var PadV2 = "PadV2"; - var Pool = "Pool"; - var Pow = "Pow"; - var Prelu = "Prelu"; - var Prod = "Prod"; - var Range = "Range"; - var Real = "Real"; - var Reciprocal = "Reciprocal"; - var Relu = "Relu"; - var Reshape = "Reshape"; - var ResizeNearestNeighbor = "ResizeNearestNeighbor"; - var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; - var ResizeBilinear = "ResizeBilinear"; - var ResizeBilinearGrad = "ResizeBilinearGrad"; - var Relu6 = "Relu6"; - var Reverse = "Reverse"; - var Round = "Round"; - var Rsqrt = "Rsqrt"; - var ScatterNd = "ScatterNd"; - var Select = "Select"; - var Selu = "Selu"; - var Slice = "Slice"; - var Sin = "Sin"; - var Sinh = "Sinh"; - var Sign = "Sign"; - var Sigmoid = "Sigmoid"; - var Softplus = "Softplus"; - var Sqrt = "Sqrt"; - var Sum = "Sum"; - var SpaceToBatchND = "SpaceToBatchND"; - var SplitV = "SplitV"; - var Softmax = "Softmax"; - var SparseFillEmptyRows = "SparseFillEmptyRows"; - var SparseReshape = "SparseReshape"; - var SparseSegmentMean = "SparseSegmentMean"; - var SparseSegmentSum = "SparseSegmentSum"; - var SparseToDense = "SparseToDense"; - var SquaredDifference = "SquaredDifference"; - var Square = "Square"; - var StridedSlice = "StridedSlice"; - var StringNGrams = "StringNGrams"; - var StringSplit = "StringSplit"; - var StringToHashBucketFast = "StringToHashBucketFast"; - var Sub = "Sub"; - var Tan = "Tan"; - var Tanh = "Tanh"; - var Tile = "Tile"; - var TopK = "TopK"; - var Transform = "Transform"; - var Transpose = "Transpose"; - var Unique = "Unique"; - var Unpack = "Unpack"; - var UnsortedSegmentSum = "UnsortedSegmentSum"; - var ZerosLike = "ZerosLike"; - var Step = "Step"; - var FromPixels = "FromPixels"; - var RotateWithOffset = "RotateWithOffset"; - var _FusedMatMul = "_FusedMatMul"; - var FusedConv2D = "FusedConv2D"; - var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; - var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); - var gradRegistry = getGlobal("gradRegistry", () => new Map()); - function getKernel(kernelName, backendName) { - const key = makeKey(kernelName, backendName); - return kernelRegistry.get(key); - } - function getGradient(kernelName) { - return gradRegistry.get(kernelName); - } - function getKernelsForBackend(backendName) { - const it = kernelRegistry.entries(); - const result = []; - while (true) { - const { done, value } = it.next(); - if (done) { - break; - } - const [key, config] = value; - const [backend2] = key.split("_"); - if (backend2 === backendName) { - result.push(config); - } - } - return result; - } - function registerKernel(config) { - const { kernelName, backendName } = config; - const key = makeKey(kernelName, backendName); - if (kernelRegistry.has(key)) { - warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); - } - kernelRegistry.set(key, config); - } - function registerGradient(config) { - const { kernelName } = config; - if (gradRegistry.has(kernelName)) { - if (env().getBool("DEBUG")) { - warn(`Overriding the gradient for '${kernelName}'`); - } - } - gradRegistry.set(kernelName, config); - } - function unregisterKernel(kernelName, backendName) { - const key = makeKey(kernelName, backendName); - if (!kernelRegistry.has(key)) { - throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); - } - kernelRegistry.delete(key); - } - function unregisterGradient(kernelName) { - if (!gradRegistry.has(kernelName)) { - throw new Error(`The gradient '${kernelName}' for backend is not registered`); - } - gradRegistry.delete(kernelName); - } - function copyRegisteredKernels(registeredBackendName, newBackendName) { - const kernels = getKernelsForBackend(registeredBackendName); - kernels.forEach((kernelConfig) => { - const newKernelConfig = Object.assign({}, kernelConfig, { backendName: newBackendName }); - registerKernel(newKernelConfig); - }); - } - function makeKey(kernelName, backendName) { - return `${backendName}_${kernelName}`; - } - var util_exports = {}; - __export2(util_exports, { - arraysEqual: () => arraysEqual, - assert: () => assert, - assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, - assertNonNull: () => assertNonNull, - assertShapesMatch: () => assertShapesMatch, - bytesFromStringArray: () => bytesFromStringArray, - bytesPerElement: () => bytesPerElement, - checkConversionForErrors: () => checkConversionForErrors, - clamp: () => clamp, - computeStrides: () => computeStrides, - createScalarValue: () => createScalarValue, - createShuffledIndices: () => createShuffledIndices, - decodeString: () => decodeString, - distSquared: () => distSquared, - encodeString: () => encodeString, - fetch: () => fetch3, - fingerPrint64: () => fingerPrint64, - flatten: () => flatten, - getArrayFromDType: () => getArrayFromDType, - getTypedArrayFromDType: () => getTypedArrayFromDType, - hasEncodingLoss: () => hasEncodingLoss, - hexToLong: () => hexToLong, - indexToLoc: () => indexToLoc, - inferDtype: () => inferDtype, - inferFromImplicitShape: () => inferFromImplicitShape, - isBoolean: () => isBoolean, - isFunction: () => isFunction, - isInt: () => isInt, - isNumber: () => isNumber, - isPromise: () => isPromise, - isScalarShape: () => isScalarShape, - isString: () => isString, - isTypedArray: () => isTypedArray, - isValidDtype: () => isValidDtype, - locToIndex: () => locToIndex, - makeOnesTypedArray: () => makeOnesTypedArray, - makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, - makeZerosTypedArray: () => makeZerosTypedArray, - nearestDivisor: () => nearestDivisor, - nearestLargerEven: () => nearestLargerEven, - now: () => now, - parseAxisParam: () => parseAxisParam, - randUniform: () => randUniform, - repeatedTry: () => repeatedTry, - rightPad: () => rightPad, - shuffle: () => shuffle, - shuffleCombo: () => shuffleCombo, - sizeFromShape: () => sizeFromShape, - sizeToSquarishShape: () => sizeToSquarishShape, - squeezeShape: () => squeezeShape, - sum: () => sum, - swap: () => swap, - tanh: () => tanh, - toNestedArray: () => toNestedArray, - toTypedArray: () => toTypedArray - }); - var LongExports = __toModule(require_long()); - var Long = LongExports.default || LongExports; - function hexToLong(hex) { - return Long.fromString(hex, true, 16); - } - var k0 = hexToLong("c3a5c85c97cb3127"); - var k1 = hexToLong("b492b66fbe98f273"); - var k2 = hexToLong("9ae16a3b2f90404f"); - function shiftMix(val) { - return val.xor(val.shru(47)); - } - function fetch2(s, offset, numBytes) { - const bytes = s.slice(offset, offset + numBytes); - return Long.fromBytes(Array.from(bytes), true, true); - } - function fetch64(s, offset) { - return fetch2(s, offset, 8); - } - function fetch32(s, offset) { - return fetch2(s, offset, 4); - } - function rotate64(val, shift) { - return shift === 0 ? val : val.shru(shift).or(val.shl(64 - shift)); - } - function hashLen16(u, v, mul2 = hexToLong("9ddfea08eb382d69")) { - let a = u.xor(v).mul(mul2); - a = a.xor(a.shru(47)); - let b = v.xor(a).mul(mul2); - b = b.xor(b.shru(47)); - b = b.mul(mul2); - return b; - } - function weakHashLen32WithSeeds(w, x, y, z, a, b) { - a = a.add(w); - b = rotate64(b.add(a).add(z), 21); - const c = a; - a = a.add(x); - a = a.add(y); - b = b.add(rotate64(a, 44)); - return [a.add(z), b.add(c)]; - } - function weakHashLen32WithSeedsStr(s, offset, a, b) { - return weakHashLen32WithSeeds(fetch64(s, offset), fetch64(s, offset + 8), fetch64(s, offset + 16), fetch64(s, offset + 24), a, b); - } - function hashLen0to16(s, len = s.length) { - if (len >= 8) { - const mul2 = k2.add(len * 2); - const a = fetch64(s, 0).add(k2); - const b = fetch64(s, len - 8); - const c = rotate64(b, 37).mul(mul2).add(a); - const d = rotate64(a, 25).add(b).mul(mul2); - return hashLen16(c, d, mul2); - } - if (len >= 4) { - const mul2 = k2.add(len * 2); - const a = fetch32(s, 0); - return hashLen16(a.shl(3).add(len), fetch32(s, len - 4), mul2); - } - if (len > 0) { - const a = s[0]; - const b = s[len >> 1]; - const c = s[len - 1]; - const y = a + (b << 8); - const z = len + (c << 2); - return shiftMix(k2.mul(y).xor(k0.mul(z))).mul(k2); - } - return k2; - } - function hashLen17to32(s, len = s.length) { - const mul2 = k2.add(len * 2); - const a = fetch64(s, 0).mul(k1); - const b = fetch64(s, 8); - const c = fetch64(s, len - 8).mul(mul2); - const d = fetch64(s, len - 16).mul(k2); - return hashLen16(rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d), a.add(rotate64(b.add(k2), 18)).add(c), mul2); - } - function hashLen33to64(s, len = s.length) { - const mul2 = k2.add(len * 2); - const a = fetch64(s, 0).mul(k2); - const b = fetch64(s, 8); - const c = fetch64(s, len - 8).mul(mul2); - const d = fetch64(s, len - 16).mul(k2); - const y = rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d); - const z = hashLen16(y, a.add(rotate64(b.add(k2), 18)).add(c), mul2); - const e = fetch64(s, 16).mul(mul2); - const f = fetch64(s, 24); - const g = y.add(fetch64(s, len - 32)).mul(mul2); - const h = z.add(fetch64(s, len - 24)).mul(mul2); - return hashLen16(rotate64(e.add(f), 43).add(rotate64(g, 30)).add(h), e.add(rotate64(f.add(a), 18)).add(g), mul2); - } - function fingerPrint64(s, len = s.length) { - const seed = Long.fromNumber(81, true); - if (len <= 32) { - if (len <= 16) { - return hashLen0to16(s, len); - } else { - return hashLen17to32(s, len); - } - } else if (len <= 64) { - return hashLen33to64(s, len); - } - let x = seed; - let y = seed.mul(k1).add(113); - let z = shiftMix(y.mul(k2).add(113)).mul(k2); - let v = [Long.UZERO, Long.UZERO]; - let w = [Long.UZERO, Long.UZERO]; - x = x.mul(k2).add(fetch64(s, 0)); - let offset = 0; - const end = (len - 1 >> 6) * 64; - const last64 = end + (len - 1 & 63) - 63; - do { - x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(k1); - y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(k1); - x = x.xor(w[1]); - y = y.add(v[0]).add(fetch64(s, offset + 40)); - z = rotate64(z.add(w[0]), 33).mul(k1); - v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(k1), x.add(w[0])); - w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16))); - [z, x] = [x, z]; - offset += 64; - } while (offset !== end); - const mul2 = k1.add(z.and(255).shl(1)); - offset = last64; - w[0] = w[0].add(len - 1 & 63); - v[0] = v[0].add(w[0]); - w[0] = w[0].add(v[0]); - x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(mul2); - y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(mul2); - x = x.xor(w[1].mul(9)); - y = y.add(v[0].mul(9).add(fetch64(s, offset + 40))); - z = rotate64(z.add(w[0]), 33).mul(mul2); - v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(mul2), x.add(w[0])); - w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16))); - [z, x] = [x, z]; - return hashLen16(hashLen16(v[0], w[0], mul2).add(shiftMix(y).mul(k0)).add(z), hashLen16(v[1], w[1], mul2).add(x), mul2); - } - function createScalarValue(value, dtype) { - if (dtype === "string") { - return encodeString(value); - } - return toTypedArray([value], dtype); - } - function noConversionNeeded(a, dtype) { - return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; - } - function toTypedArray(a, dtype) { - if (dtype === "string") { - throw new Error("Cannot convert a string[] to a TypedArray"); - } - if (Array.isArray(a)) { - a = flatten(a); - } - if (env().getBool("DEBUG")) { - checkConversionForErrors(a, dtype); - } - if (noConversionNeeded(a, dtype)) { - return a; - } - if (dtype == null || dtype === "float32" || dtype === "complex64") { - return new Float32Array(a); - } else if (dtype === "int32") { - return new Int32Array(a); - } else if (dtype === "bool") { - const bool = new Uint8Array(a.length); - for (let i = 0; i < bool.length; ++i) { - if (Math.round(a[i]) !== 0) { - bool[i] = 1; - } - } - return bool; - } else { - throw new Error(`Unknown data type ${dtype}`); - } - } - function now() { - return env().platform.now(); - } - function fetch3(path, requestInits) { - return env().platform.fetch(path, requestInits); - } - function encodeString(s, encoding = "utf-8") { - encoding = encoding || "utf-8"; - return env().platform.encode(s, encoding); - } - function decodeString(bytes, encoding = "utf-8") { - encoding = encoding || "utf-8"; - return env().platform.decode(bytes, encoding); - } - var Profiler = class { - constructor(backendTimer, logger) { - this.backendTimer = backendTimer; - this.logger = logger; - if (logger == null) { - this.logger = new Logger(); - } - } - profileKernel(kernelName, inputs, f) { - let outputs; - const holdResultWrapperFn = () => { - outputs = f(); - }; - let timer; - const start = now(); - if (this.backendTimer.timerAvailable()) { - timer = this.backendTimer.time(holdResultWrapperFn); - } else { - holdResultWrapperFn(); - for (const output of outputs) { - output.dataSync(); - } - timer = Promise.resolve({ kernelMs: now() - start }); - } - if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { - for (let i = 0; i < outputs.length; i++) { - const output = outputs[i]; - output.data().then((tensorVals) => { - checkComputationForErrors(tensorVals, output.dtype, kernelName); - }); - } - } - const kernelProfile = { - kernelName, - outputs, - inputs, - timeMs: timer.then((timing) => timing.kernelMs), - extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") - }; - return kernelProfile; - } - logKernelProfile(kernelProfile) { - const { kernelName, outputs, timeMs, inputs, extraInfo } = kernelProfile; - outputs.forEach((result) => { - Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { - this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); - }); - }); - } - }; - function checkComputationForErrors(vals, dtype, kernelName) { - if (dtype !== "float32") { - return false; - } - for (let i = 0; i < vals.length; i++) { - const num = vals[i]; - if (isNaN(num) || !isFinite(num)) { - console.warn(`Found ${num} in the result of '${kernelName}'`); - return true; - } - } - return false; - } - var Logger = class { - logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) { - const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; - const paddedName = rightPad(name, 25); - const rank = result.rank; - const size = result.size; - const shape = rightPad(result.shape.toString(), 14); - let inputShapesDescription = ""; - for (const name2 in inputs) { - const input2 = inputs[name2]; - if (input2 != null) { - const inputShape = input2.shape || result.shape; - const inputRank = inputShape.length; - inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; - } - } - console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); - } - }; - function getFilteredNodesXToY(tape, xs, y) { - const tensorsFromX = {}; - const nodesFromX = {}; - for (let i = 0; i < xs.length; i++) { - tensorsFromX[xs[i].id] = true; - } - for (let i = 0; i < tape.length; i++) { - const node2 = tape[i]; - const nodeInputs = node2.inputs; - for (const inputName in nodeInputs) { - const input2 = nodeInputs[inputName]; - let anyInputFromX = false; - for (let j = 0; j < xs.length; j++) { - if (tensorsFromX[input2.id]) { - node2.outputs.forEach((output) => tensorsFromX[output.id] = true); - anyInputFromX = true; - nodesFromX[node2.id] = true; - break; - } - } - if (anyInputFromX) { - break; - } - } - } - const tensorsLeadToY = {}; - tensorsLeadToY[y.id] = true; - const nodesToY = {}; - for (let i = tape.length - 1; i >= 0; i--) { - const node2 = tape[i]; - const nodeInputs = node2.inputs; - for (let j = 0; j < node2.outputs.length; j++) { - if (tensorsLeadToY[node2.outputs[j].id]) { - for (const inputName in nodeInputs) { - tensorsLeadToY[nodeInputs[inputName].id] = true; - nodesToY[node2.id] = true; - } - break; - } - } - } - const filteredTape = []; - for (let i = 0; i < tape.length; i++) { - const node2 = tape[i]; - if (nodesFromX[node2.id] && nodesToY[node2.id]) { - const prunedInputs = {}; - for (const inputName in node2.inputs) { - const nodeInput = node2.inputs[inputName]; - if (tensorsFromX[nodeInput.id]) { - prunedInputs[inputName] = nodeInput; - } - } - const prunedNode = Object.assign({}, node2); - prunedNode.inputs = prunedInputs; - prunedNode.outputs = node2.outputs; - filteredTape.push(prunedNode); - } - } - return filteredTape; - } - function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { - for (let i = filteredTape.length - 1; i >= 0; i--) { - const node2 = filteredTape[i]; - const dys = []; - node2.outputs.forEach((o) => { - const gradTensor = tensorAccumulatedGradientMap[o.id]; - if (gradTensor != null) { - dys.push(gradTensor); - } else { - dys.push(null); - } - }); - if (node2.gradient == null) { - throw new Error(`Cannot compute gradient: gradient function not found for ${node2.kernelName}.`); - } - const inputGradients = node2.gradient(dys); - for (const inputName in node2.inputs) { - if (!(inputName in inputGradients)) { - throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); - } - const dx = tidy2(() => inputGradients[inputName]()); - if (dx.dtype !== "float32") { - throw new Error(`Error in gradient for op ${node2.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); - } - const x = node2.inputs[inputName]; - if (!arraysEqual(dx.shape, x.shape)) { - throw new Error(`Error in gradient for op ${node2.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); - } - if (tensorAccumulatedGradientMap[x.id] == null) { - tensorAccumulatedGradientMap[x.id] = dx; - } else { - const curGradient = tensorAccumulatedGradientMap[x.id]; - tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx); - curGradient.dispose(); - } - } - } - } - var FORMAT_LIMIT_NUM_VALS = 20; - var FORMAT_NUM_FIRST_LAST_VALS = 3; - var FORMAT_NUM_SIG_DIGITS = 7; - function tensorToString(vals, shape, dtype, verbose) { - const strides = computeStrides(shape); - const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); - const rank = shape.length; - const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); - const lines = ["Tensor"]; - if (verbose) { - lines.push(` dtype: ${dtype}`); - lines.push(` rank: ${rank}`); - lines.push(` shape: [${shape}]`); - lines.push(` values:`); - } - lines.push(valsLines.map((l) => " " + l).join("\n")); - return lines.join("\n"); - } - function computeMaxSizePerColumn(vals, shape, dtype, strides) { - const n = sizeFromShape(shape); - const numCols = strides[strides.length - 1]; - const padPerCol = new Array(numCols).fill(0); - const rank = shape.length; - const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; - if (rank > 1) { - for (let row = 0; row < n / numCols; row++) { - const offset = row * numCols; - for (let j = 0; j < numCols; j++) { - padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); - } - } - } - return padPerCol; - } - function valToString(val, pad3, dtype) { - let valStr; - if (Array.isArray(val)) { - valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; - } else if (isString(val)) { - valStr = `'${val}'`; - } else if (dtype === "bool") { - valStr = boolNumToString(val); - } else { - valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); - } - return rightPad(valStr, pad3); - } - function boolNumToString(v) { - return v === 0 ? "false" : "true"; - } - function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { - const storagePerElement = dtype === "complex64" ? 2 : 1; - const size = shape[0]; - const rank = shape.length; - if (rank === 0) { - if (dtype === "complex64") { - const complexTuple = createComplexTuples(vals); - return [valToString(complexTuple[0], 0, dtype)]; - } - if (dtype === "bool") { - return [boolNumToString(vals[0])]; - } - return [vals[0].toString()]; - } - if (rank === 1) { - if (size > FORMAT_LIMIT_NUM_VALS) { - const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; - let firstVals = Array.from(vals.slice(0, firstValsSize)); - let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); - if (dtype === "complex64") { - firstVals = createComplexTuples(firstVals); - lastVals = createComplexTuples(lastVals); - } - return [ - "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" - ]; - } - const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); - return [ - "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" - ]; - } - const subshape = shape.slice(1); - const substrides = strides.slice(1); - const stride = strides[0] * storagePerElement; - const lines = []; - if (size > FORMAT_LIMIT_NUM_VALS) { - for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { - const start = i * stride; - const end = start + stride; - lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); - } - lines.push("..."); - for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { - const start = i * stride; - const end = start + stride; - lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); - } - } else { - for (let i = 0; i < size; i++) { - const start = i * stride; - const end = start + stride; - lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); - } - } - const sep = rank === 2 ? "," : ""; - lines[0] = "[" + lines[0] + sep; - for (let i = 1; i < lines.length - 1; i++) { - lines[i] = " " + lines[i] + sep; - } - let newLineSep = ",\n"; - for (let i = 2; i < rank; i++) { - newLineSep += "\n"; - } - lines[lines.length - 1] = " " + lines[lines.length - 1] + "]" + (isLast ? "" : newLineSep); - return lines; - } - function createComplexTuples(vals) { - const complexTuples = []; - for (let i = 0; i < vals.length; i += 2) { - complexTuples.push([vals[i], vals[i + 1]]); - } - return complexTuples; - } - var TensorBuffer = class { - constructor(shape, dtype, values) { - this.dtype = dtype; - this.shape = shape.slice(); - this.size = sizeFromShape(shape); - if (values != null) { - const n = values.length; - assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); - } - if (dtype === "complex64") { - throw new Error(`complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).`); - } - this.values = values || getArrayFromDType(dtype, this.size); - this.strides = computeStrides(shape); - } - set(value, ...locs) { - if (locs.length === 0) { - locs = [0]; - } - assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); - const index = this.locToIndex(locs); - this.values[index] = value; - } - get(...locs) { - if (locs.length === 0) { - locs = [0]; - } - let i = 0; - for (const loc of locs) { - if (loc < 0 || loc >= this.shape[i]) { - const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; - throw new Error(msg); - } - i++; - } - let index = locs[locs.length - 1]; - for (let i2 = 0; i2 < locs.length - 1; ++i2) { - index += this.strides[i2] * locs[i2]; - } - return this.values[index]; - } - locToIndex(locs) { - if (this.rank === 0) { - return 0; - } else if (this.rank === 1) { - return locs[0]; - } - let index = locs[locs.length - 1]; - for (let i = 0; i < locs.length - 1; ++i) { - index += this.strides[i] * locs[i]; - } - return index; - } - indexToLoc(index) { - if (this.rank === 0) { - return []; - } else if (this.rank === 1) { - return [index]; - } - const locs = new Array(this.shape.length); - for (let i = 0; i < locs.length - 1; ++i) { - locs[i] = Math.floor(index / this.strides[i]); - index -= locs[i] * this.strides[i]; - } - locs[locs.length - 1] = index; - return locs; - } - get rank() { - return this.shape.length; - } - toTensor() { - return trackerFn().makeTensor(this.values, this.shape, this.dtype); - } - }; - var trackerFn = null; - var opHandler = null; - var deprecationWarningFn = null; - function setTensorTracker(fn) { - trackerFn = fn; - } - function setOpHandler(handler) { - opHandler = handler; - } - function setDeprecationWarningFn(fn) { - deprecationWarningFn = fn; - } - var Tensor = class { - constructor(shape, dtype, dataId, id) { - this.kept = false; - this.isDisposedInternal = false; - this.shape = shape.slice(); - this.dtype = dtype || "float32"; - this.size = sizeFromShape(shape); - this.strides = computeStrides(shape); - this.dataId = dataId; - this.id = id; - this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; - } - get rank() { - return this.shape.length; - } - async buffer() { - const vals = await this.data(); - return opHandler.buffer(this.shape, this.dtype, vals); - } - bufferSync() { - return opHandler.buffer(this.shape, this.dtype, this.dataSync()); - } - async array() { - const vals = await this.data(); - return toNestedArray(this.shape, vals, this.dtype === "complex64"); - } - arraySync() { - return toNestedArray(this.shape, this.dataSync(), this.dtype === "complex64"); - } - async data() { - this.throwIfDisposed(); - const data = trackerFn().read(this.dataId); - if (this.dtype === "string") { - const bytes = await data; - try { - return bytes.map((b) => decodeString(b)); - } catch (_a) { - throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); - } - } - return data; - } - dataSync() { - this.throwIfDisposed(); - const data = trackerFn().readSync(this.dataId); - if (this.dtype === "string") { - try { - return data.map((b) => decodeString(b)); - } catch (_a) { - throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); - } - } - return data; - } - async bytes() { - this.throwIfDisposed(); - const data = await trackerFn().read(this.dataId); - if (this.dtype === "string") { - return data; - } else { - return new Uint8Array(data.buffer); - } - } - dispose() { - if (this.isDisposed) { - return; - } - trackerFn().disposeTensor(this); - this.isDisposedInternal = true; - } - get isDisposed() { - return this.isDisposedInternal; - } - throwIfDisposed() { - if (this.isDisposed) { - throw new Error(`Tensor is disposed.`); - } - } - print(verbose = false) { - return opHandler.print(this, verbose); - } - clone() { - this.throwIfDisposed(); - return opHandler.clone(this); - } - toString(verbose = false) { - const vals = this.dataSync(); - return tensorToString(vals, this.shape, this.dtype, verbose); - } - cast(dtype) { - this.throwIfDisposed(); - return opHandler.cast(this, dtype); - } - variable(trainable = true, name, dtype) { - this.throwIfDisposed(); - return trackerFn().makeVariable(this, trainable, name, dtype); - } - }; - Object.defineProperty(Tensor, Symbol.hasInstance, { - value: (instance) => { - return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null; - } - }); - function getGlobalTensorClass() { - return getGlobal("Tensor", () => { - return Tensor; - }); - } - getGlobalTensorClass(); - var Variable = class extends Tensor { - constructor(initialValue, trainable, name, tensorId) { - super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); - this.trainable = trainable; - this.name = name; - } - assign(newValue) { - if (newValue.dtype !== this.dtype) { - throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); - } - if (!arraysEqual(newValue.shape, this.shape)) { - throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); - } - trackerFn().disposeTensor(this); - this.dataId = newValue.dataId; - trackerFn().incRef(this, null); - } - dispose() { - trackerFn().disposeVariable(this); - this.isDisposedInternal = true; - } - }; - Object.defineProperty(Variable, Symbol.hasInstance, { - value: (instance) => { - return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function; - } - }); - var tensor_util_exports = {}; - __export2(tensor_util_exports, { - assertTypesMatch: () => assertTypesMatch, - getTensorsInContainer: () => getTensorsInContainer, - isTensorInList: () => isTensorInList, - makeTypesMatch: () => makeTypesMatch - }); - var Rank; - (function(Rank2) { - Rank2["R0"] = "R0"; - Rank2["R1"] = "R1"; - Rank2["R2"] = "R2"; - Rank2["R3"] = "R3"; - Rank2["R4"] = "R4"; - Rank2["R5"] = "R5"; - Rank2["R6"] = "R6"; - })(Rank || (Rank = {})); - var UpcastInt32AndMap; - (function(UpcastInt32AndMap2) { - UpcastInt32AndMap2["float32"] = "float32"; - UpcastInt32AndMap2["int32"] = "int32"; - UpcastInt32AndMap2["bool"] = "int32"; - UpcastInt32AndMap2["complex64"] = "complex64"; - })(UpcastInt32AndMap || (UpcastInt32AndMap = {})); - var UpcastBoolAndMap; - (function(UpcastBoolAndMap2) { - UpcastBoolAndMap2["float32"] = "float32"; - UpcastBoolAndMap2["int32"] = "int32"; - UpcastBoolAndMap2["bool"] = "bool"; - UpcastBoolAndMap2["complex64"] = "complex64"; - })(UpcastBoolAndMap || (UpcastBoolAndMap = {})); - var UpcastFloat32AndMap; - (function(UpcastFloat32AndMap2) { - UpcastFloat32AndMap2["float32"] = "float32"; - UpcastFloat32AndMap2["int32"] = "float32"; - UpcastFloat32AndMap2["bool"] = "float32"; - UpcastFloat32AndMap2["complex64"] = "complex64"; - })(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); - var UpcastComplex64AndMap; - (function(UpcastComplex64AndMap2) { - UpcastComplex64AndMap2["float32"] = "complex64"; - UpcastComplex64AndMap2["int32"] = "complex64"; - UpcastComplex64AndMap2["bool"] = "complex64"; - UpcastComplex64AndMap2["complex64"] = "complex64"; - })(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); - var upcastTypeMap = { - "float32": UpcastFloat32AndMap, - "int32": UpcastInt32AndMap, - "bool": UpcastBoolAndMap, - "complex64": UpcastComplex64AndMap - }; - function upcastType(typeA, typeB) { - if (typeA === "string" || typeB === "string") { - if (typeA === "string" && typeB === "string") { - return "string"; - } - throw new Error(`Can not upcast ${typeA} with ${typeB}`); - } - return upcastTypeMap[typeA][typeB]; - } - function sumOutType(type) { - return upcastType(type, "int32"); - } - function makeTypesMatch(a, b) { - if (a.dtype === b.dtype) { - return [a, b]; - } - const dtype = upcastType(a.dtype, b.dtype); - return [a.cast(dtype), b.cast(dtype)]; - } - function assertTypesMatch(a, b) { - assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); - } - function isTensorInList(tensor2, tensorList) { - return tensorList.some((x) => x.id === tensor2.id); - } - function getTensorsInContainer(result) { - const list = []; - const seen = new Set(); - walkTensorContainer(result, list, seen); - return list; - } - function walkTensorContainer(container, list, seen) { - if (container == null) { - return; - } - if (container instanceof Tensor) { - list.push(container); - return; - } - if (!isIterable(container)) { - return; - } - const iterable = container; - for (const k in iterable) { - const val = iterable[k]; - if (!seen.has(val)) { - seen.add(val); - walkTensorContainer(val, list, seen); - } - } - } - function isIterable(obj) { - return Array.isArray(obj) || typeof obj === "object"; - } - function isRegisteredKernelInvocation(kernelInvocation) { - return kernelInvocation.kernelName != null; - } - var EngineState = class { - constructor() { - this.registeredVariables = {}; - this.nextTapeNodeId = 0; - this.numBytes = 0; - this.numTensors = 0; - this.numStringTensors = 0; - this.numDataBuffers = 0; - this.gradientDepth = 0; - this.kernelDepth = 0; - this.scopeStack = []; - this.numDataMovesStack = []; - this.nextScopeId = 0; - this.tensorInfo = new WeakMap(); - this.profiling = false; - this.activeProfile = { - newBytes: 0, - newTensors: 0, - peakBytes: 0, - kernels: [], - result: null, - get kernelNames() { - return Array.from(new Set(this.kernels.map((k) => k.name))); - } - }; - } - dispose() { - for (const variableName in this.registeredVariables) { - this.registeredVariables[variableName].dispose(); - } - } - }; - var Engine = class { - constructor(ENV5) { - this.ENV = ENV5; - this.registry = {}; - this.registryFactory = {}; - this.pendingBackendInitId = 0; - this.state = new EngineState(); - } - async ready() { - if (this.pendingBackendInit != null) { - return this.pendingBackendInit.then(() => { - }); - } - if (this.backendInstance != null) { - return; - } - const sortedBackends = this.getSortedBackends(); - for (let i = 0; i < sortedBackends.length; i++) { - const backendName = sortedBackends[i]; - const success = await this.initializeBackend(backendName).success; - if (success) { - await this.setBackend(backendName); - return; - } - } - throw new Error(`Could not initialize any backends, all backend initializations failed.`); - } - get backend() { - if (this.pendingBackendInit != null) { - throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); - } - if (this.backendInstance == null) { - const { name, asyncInit } = this.initializeBackendsAndReturnBest(); - if (asyncInit) { - throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); - } - this.setBackend(name); - } - return this.backendInstance; - } - backendNames() { - return Object.keys(this.registryFactory); - } - findBackend(backendName) { - if (!(backendName in this.registry)) { - if (backendName in this.registryFactory) { - const { asyncInit } = this.initializeBackend(backendName); - if (asyncInit) { - return null; - } - } else { - return null; - } - } - return this.registry[backendName]; - } - findBackendFactory(backendName) { - if (!(backendName in this.registryFactory)) { - return null; - } - return this.registryFactory[backendName].factory; - } - registerBackend(backendName, factory, priority = 1) { - if (backendName in this.registryFactory) { - warn(`${backendName} backend was already registered. Reusing existing backend factory.`); - return false; - } - this.registryFactory[backendName] = { factory, priority }; - return true; - } - async setBackend(backendName) { - if (this.registryFactory[backendName] == null) { - throw new Error(`Backend name '${backendName}' not found in registry`); - } - this.backendName = backendName; - if (this.registry[backendName] == null) { - this.backendInstance = null; - const { success, asyncInit } = this.initializeBackend(backendName); - const result = asyncInit ? await success : success; - if (!result) { - return false; - } - } - this.backendInstance = this.registry[backendName]; - this.setupRegisteredKernels(); - this.profiler = new Profiler(this.backendInstance); - return true; - } - setupRegisteredKernels() { - const kernels = getKernelsForBackend(this.backendName); - kernels.forEach((kernel) => { - if (kernel.setupFunc != null) { - kernel.setupFunc(this.backendInstance); - } - }); - } - disposeRegisteredKernels(backendName) { - const kernels = getKernelsForBackend(backendName); - kernels.forEach((kernel) => { - if (kernel.disposeFunc != null) { - kernel.disposeFunc(this.registry[backendName]); - } - }); - } - initializeBackend(backendName) { - const registryFactoryEntry = this.registryFactory[backendName]; - if (registryFactoryEntry == null) { - throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); - } - try { - const backend2 = registryFactoryEntry.factory(); - if (backend2 && !(backend2 instanceof KernelBackend) && typeof backend2.then === "function") { - const promiseId = ++this.pendingBackendInitId; - const success = backend2.then((backendInstance) => { - if (promiseId < this.pendingBackendInitId) { - return false; - } - this.registry[backendName] = backendInstance; - this.pendingBackendInit = null; - return true; - }).catch((err) => { - if (promiseId < this.pendingBackendInitId) { - return false; - } - this.pendingBackendInit = null; - warn(`Initialization of backend ${backendName} failed`); - warn(err.stack || err.message); - return false; - }); - this.pendingBackendInit = success; - return { success, asyncInit: true }; - } else { - this.registry[backendName] = backend2; - return { success: true, asyncInit: false }; - } - } catch (err) { - warn(`Initialization of backend ${backendName} failed`); - warn(err.stack || err.message); - return { success: false, asyncInit: false }; - } - } - removeBackend(backendName) { - if (!(backendName in this.registryFactory)) { - throw new Error(`${backendName} backend not found in registry`); - } - if (this.backendName === backendName && this.pendingBackendInit != null) { - this.pendingBackendInitId++; - } - if (backendName in this.registry) { - this.disposeRegisteredKernels(backendName); - this.registry[backendName].dispose(); - delete this.registry[backendName]; - } - delete this.registryFactory[backendName]; - if (this.backendName === backendName) { - this.pendingBackendInit = null; - this.backendName = null; - this.backendInstance = null; - } - } - getSortedBackends() { - if (Object.keys(this.registryFactory).length === 0) { - throw new Error("No backend found in registry."); - } - return Object.keys(this.registryFactory).sort((a, b) => { - return this.registryFactory[b].priority - this.registryFactory[a].priority; - }); - } - initializeBackendsAndReturnBest() { - const sortedBackends = this.getSortedBackends(); - for (let i = 0; i < sortedBackends.length; i++) { - const backendName = sortedBackends[i]; - const { success, asyncInit } = this.initializeBackend(backendName); - if (asyncInit || success) { - return { name: backendName, asyncInit }; - } - } - throw new Error(`Could not initialize any backends, all backend initializations failed.`); - } - moveData(backend2, dataId) { - const info = this.state.tensorInfo.get(dataId); - const srcBackend = info.backend; - const values = this.readSync(dataId); - const refCount = srcBackend.refCount(dataId); - srcBackend.disposeData(dataId, true); - info.backend = backend2; - backend2.move(dataId, values, info.shape, info.dtype, refCount); - if (this.shouldCheckForMemLeaks()) { - this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; - } - } - tidy(nameOrFn, fn) { - let name = null; - if (fn == null) { - if (typeof nameOrFn !== "function") { - throw new Error("Please provide a function to tidy()"); - } - fn = nameOrFn; - } else { - if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { - throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); - } - if (typeof fn !== "function") { - throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); - } - name = nameOrFn; - } - let result; - return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => { - result = fn(); - if (result instanceof Promise) { - console.error("Cannot return a Promise inside of tidy."); - } - return result; - }); - } - scopedRun(start, end, f) { - start(); - try { - const res = f(); - end(); - return res; - } catch (ex) { - end(); - throw ex; - } - } - nextTensorId() { - return Engine.nextTensorId++; - } - nextVariableId() { - return Engine.nextVariableId++; - } - clone(x) { - const y = ENGINE.runKernel(Identity, { x }); - const inputs = { x }; - const grad2 = (dy) => ({ - x: () => { - const dtype = "float32"; - const gradInputs = { x: dy }; - const attrs = { dtype }; - return ENGINE.runKernel(Cast, gradInputs, attrs); - } - }); - const saved = []; - this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); - return y; - } - runKernel(kernelName, inputs, attrs) { - if (this.backendName == null) { - this.backend; - } - const hasKernel = getKernel(kernelName, this.backendName) != null; - if (!hasKernel) { - throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); - } - return this.runKernelFunc({ kernelName, inputs, attrs }); - } - shouldCheckForMemLeaks() { - return this.ENV.getBool("IS_TEST"); - } - checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { - const numDataIdsAfter = this.backend.numDataIds(); - let numOutputDataIds = 0; - outInfos.forEach((info) => { - numOutputDataIds += info.dtype === "complex64" ? 3 : 1; - }); - const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; - const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; - if (dataIdsLeaked > 0) { - throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); - } - } - runKernelFunc(kernelParams) { - let outputs; - let saved = []; - const isTapeOn = this.isTapeOn(); - const startingBytecount = this.state.numBytes; - const startingNumTensors = this.state.numTensors; - if (this.shouldCheckForMemLeaks()) { - this.state.numDataMovesStack.push(0); - } - let kernelFunc3; - if (this.backendName == null) { - this.backend; - } - let out; - const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; - if (isRegisteredKernelInvocation(kernelParams)) { - const { kernelName, inputs: inputs2, attrs: attrs2 } = kernelParams; - if (this.backendName == null) { - this.backend; - } - const kernel = getKernel(kernelName, this.backendName); - assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); - kernelFunc3 = () => { - const numDataIdsBefore = this.backend.numDataIds(); - out = kernel.kernelFunc({ inputs: inputs2, attrs: attrs2, backend: this.backend }); - const outInfos = Array.isArray(out) ? out : [out]; - if (this.shouldCheckForMemLeaks()) { - this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); - } - const outTensors = outInfos.map((outInfo) => { - if (outInfo.rank != null) { - return outInfo; - } - const { dataId, shape, dtype } = outInfo; - return this.makeTensorFromDataId(dataId, shape, dtype); - }); - if (isTapeOn) { - const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); - saved = this.saveTensorsForBackwardMode(tensorsToSave); - } - return outTensors; - }; - } else { - const { forwardFunc } = kernelParams; - const saveFunc = (tensors) => { - if (!isTapeOn) { - return; - } - saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); - }; - kernelFunc3 = () => { - const numDataIdsBefore = this.backend.numDataIds(); - out = this.tidy(() => forwardFunc(this.backend, saveFunc)); - const outs = Array.isArray(out) ? out : [out]; - if (this.shouldCheckForMemLeaks()) { - this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs); - } - return outs; - }; - } - const { inputs, attrs } = kernelParams; - const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; - let kernelProfile; - this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { - if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { - outputs = kernelFunc3(); - } else { - kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3()); - if (this.ENV.getBool("DEBUG")) { - this.profiler.logKernelProfile(kernelProfile); - } - outputs = kernelProfile.outputs; - } - }); - if (isTapeOn) { - this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); - } - if (this.state.profiling) { - this.state.activeProfile.kernels.push({ - name: kernelOrScopeName, - bytesAdded: this.state.numBytes - startingBytecount, - totalBytesSnapshot: this.state.numBytes, - tensorsAdded: this.state.numTensors - startingNumTensors, - totalTensorsSnapshot: this.state.numTensors, - inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), - outputShapes: outputs.map((item) => item.shape), - kernelTimeMs: kernelProfile.timeMs, - extraInfo: kernelProfile.extraInfo - }); - } - return Array.isArray(out) ? outputs : outputs[0]; - } - saveTensorsForBackwardMode(tensors) { - const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); - return saved; - } - getTensorsForGradient(kernelName, inputs, outputs) { - const gradConfig = getGradient(kernelName); - if (gradConfig != null) { - const inputsToSave = gradConfig.inputsToSave || []; - const outputsToSave = gradConfig.outputsToSave || []; - let inputTensorsToSave; - if (gradConfig.saveAllInputs) { - assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); - inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); - } else { - inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); - } - const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); - return inputTensorsToSave.concat(outputTensorsToSave); - } - return []; - } - makeTensor(values, shape, dtype, backend2) { - if (values == null) { - throw new Error("Values passed to engine.makeTensor() are null"); - } - dtype = dtype || "float32"; - backend2 = backend2 || this.backend; - let backendVals = values; - if (dtype === "string" && isString(values[0])) { - backendVals = values.map((d) => encodeString(d)); - } - const dataId = backend2.write(backendVals, shape, dtype); - const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); - this.trackTensor(t, backend2); - if (dtype === "string") { - const info = this.state.tensorInfo.get(dataId); - const newBytes = bytesFromStringArray(backendVals); - this.state.numBytes += newBytes - info.bytes; - info.bytes = newBytes; - } - return t; - } - makeTensorFromDataId(dataId, shape, dtype, backend2) { - dtype = dtype || "float32"; - const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); - this.trackTensor(t, backend2); - return t; - } - makeVariable(initialValue, trainable = true, name, dtype) { - name = name || this.nextVariableId().toString(); - if (dtype != null && dtype !== initialValue.dtype) { - initialValue = initialValue.cast(dtype); - } - const v = new Variable(initialValue, trainable, name, this.nextTensorId()); - if (this.state.registeredVariables[v.name] != null) { - throw new Error(`Variable with name ${v.name} was already registered`); - } - this.state.registeredVariables[v.name] = v; - this.incRef(v, this.backend); - return v; - } - trackTensor(a, backend2) { - this.state.numTensors++; - if (a.dtype === "string") { - this.state.numStringTensors++; - } - let bytes = 0; - if (a.dtype !== "complex64" && a.dtype !== "string") { - bytes = a.size * bytesPerElement(a.dtype); - } - this.state.numBytes += bytes; - if (!this.state.tensorInfo.has(a.dataId)) { - this.state.numDataBuffers++; - this.state.tensorInfo.set(a.dataId, { - backend: backend2 || this.backend, - dtype: a.dtype, - shape: a.shape, - bytes - }); - } - if (!(a instanceof Variable)) { - this.track(a); - } - } - incRef(a, backend2) { - this.trackTensor(a, backend2); - this.backend.incRef(a.dataId); - } - removeDataId(dataId, backend2) { - if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend2) { - this.state.tensorInfo.delete(dataId); - this.state.numDataBuffers--; - } - } - disposeTensor(a) { - if (!this.state.tensorInfo.has(a.dataId)) { - return; - } - const info = this.state.tensorInfo.get(a.dataId); - this.state.numTensors--; - if (a.dtype === "string") { - this.state.numStringTensors--; - this.state.numBytes -= info.bytes; - } - if (a.dtype !== "complex64" && a.dtype !== "string") { - const bytes = a.size * bytesPerElement(a.dtype); - this.state.numBytes -= bytes; - } - if (info.backend.disposeData(a.dataId)) { - this.removeDataId(a.dataId, info.backend); - } - } - disposeVariables() { - for (const varName in this.state.registeredVariables) { - const v = this.state.registeredVariables[varName]; - this.disposeVariable(v); - } - } - disposeVariable(v) { - this.disposeTensor(v); - if (this.state.registeredVariables[v.name] != null) { - delete this.state.registeredVariables[v.name]; - } - } - memory() { - const info = this.backend.memory(); - info.numTensors = this.state.numTensors; - info.numDataBuffers = this.state.numDataBuffers; - info.numBytes = this.state.numBytes; - if (this.state.numStringTensors > 0) { - info.unreliable = true; - if (info.reasons == null) { - info.reasons = []; - } - info.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); - } - return info; - } - async profile(query) { - this.state.profiling = true; - const startBytes = this.state.numBytes; - const startNumTensors = this.state.numTensors; - this.state.activeProfile.kernels = []; - this.state.activeProfile.result = await query(); - this.state.profiling = false; - this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); - this.state.activeProfile.newBytes = this.state.numBytes - startBytes; - this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; - for (const kernel of this.state.activeProfile.kernels) { - kernel.kernelTimeMs = await kernel.kernelTimeMs; - kernel.extraInfo = await kernel.extraInfo; - } - return this.state.activeProfile; - } - isTapeOn() { - return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; - } - addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { - const tapeNode = { id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved }; - const gradConfig = getGradient(kernelName); - if (gradConfig != null) { - gradientsFunc = gradConfig.gradFunc; - } - if (gradientsFunc != null) { - tapeNode.gradient = (dys) => { - dys = dys.map((dy, i) => { - if (dy == null) { - const output = outputs[i]; - const vals = makeZerosTypedArray(output.size, output.dtype); - return this.makeTensor(vals, output.shape, output.dtype); - } - return dy; - }); - return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); - }; - } - this.state.activeTape.push(tapeNode); - } - keep(result) { - result.kept = true; - return result; - } - startTape() { - if (this.state.gradientDepth === 0) { - this.state.activeTape = []; - } - this.state.gradientDepth++; - } - endTape() { - this.state.gradientDepth--; - } - startScope(name) { - const scopeInfo = { - track: [], - name: "unnamed scope", - id: this.state.nextScopeId++ - }; - if (name) { - scopeInfo.name = name; - } - this.state.scopeStack.push(scopeInfo); - this.state.activeScope = scopeInfo; - } - endScope(result) { - const tensorsToTrackInParent = getTensorsInContainer(result); - const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); - for (let i = 0; i < this.state.activeScope.track.length; i++) { - const tensor2 = this.state.activeScope.track[i]; - if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { - tensor2.dispose(); - } - } - const oldScope = this.state.scopeStack.pop(); - this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; - tensorsToTrackInParent.forEach((tensor2) => { - if (!tensor2.kept && tensor2.scopeId === oldScope.id) { - this.track(tensor2); - } - }); - } - gradients(f, xs, dy, allowNoGradients = false) { - assert(xs.length > 0, () => "gradients() received an empty list of xs."); - if (dy != null && dy.dtype !== "float32") { - throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); - } - const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); - assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); - const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); - if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { - throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); - } - return this.tidy("backward", () => { - const accumulatedGradientMap = {}; - accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; - backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); - const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); - if (this.state.gradientDepth === 0) { - this.state.activeTape.forEach((node2) => { - for (const tensor2 of node2.saved) { - tensor2.dispose(); - } - }); - this.state.activeTape = null; - } - return { value: y, grads: grads2 }; - }); - } - customGrad(f) { - assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); - return (...inputs) => { - assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); - let res; - const inputMap = {}; - inputs.forEach((input2, i) => { - inputMap[i] = input2; - }); - const forwardFunc = (_, save) => { - res = f(...[...inputs, save]); - assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); - assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); - return res.value; - }; - const backwardsFunc = (dy, saved) => { - const gradRes = res.gradFunc(dy, saved); - const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; - assert(grads2.length === inputs.length, () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."); - assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); - const gradMap = {}; - grads2.forEach((grad2, i) => { - gradMap[i] = () => grad2; - }); - return gradMap; - }; - return this.runKernelFunc({ - forwardFunc, - backwardsFunc, - inputs: inputMap - }); - }; - } - readSync(dataId) { - const info = this.state.tensorInfo.get(dataId); - return info.backend.readSync(dataId); - } - read(dataId) { - const info = this.state.tensorInfo.get(dataId); - return info.backend.read(dataId); - } - async time(query) { - const start = now(); - const timingInfo = await this.backend.time(query); - timingInfo.wallMs = now() - start; - return timingInfo; - } - track(result) { - if (this.state.activeScope != null) { - result.scopeId = this.state.activeScope.id; - this.state.activeScope.track.push(result); - } - return result; - } - get registeredVariables() { - return this.state.registeredVariables; - } - reset() { - this.pendingBackendInitId++; - this.state.dispose(); - this.ENV.reset(); - this.state = new EngineState(); - for (const backendName in this.registry) { - this.disposeRegisteredKernels(backendName); - this.registry[backendName].dispose(); - delete this.registry[backendName]; - } - this.backendName = null; - this.backendInstance = null; - this.pendingBackendInit = null; - } - }; - Engine.nextTensorId = 0; - Engine.nextVariableId = 0; - function ones(shape) { - const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); - return ENGINE.makeTensor(values, shape, "float32"); - } - function getOrMakeEngine() { - const ns = getGlobalNamespace(); - if (ns._tfengine == null) { - const environment2 = new Environment(ns); - ns._tfengine = new Engine(environment2); - } - setEnvironmentGlobal(ns._tfengine.ENV); - setTensorTracker(() => ns._tfengine); - return ns._tfengine; - } - var ENGINE = getOrMakeEngine(); - function add(a, b) { - const inputs = { a, b }; - return ENGINE.runKernel(Add, inputs); - } - var device_util_exports = {}; - __export2(device_util_exports, { - isBrowser: () => isBrowser, - isMobile: () => isMobile - }); - function _isNavigatorDefined() { - return typeof navigator !== "undefined" && navigator != null; - } - function isMobile(nav) { - if (nav || _isNavigatorDefined()) { - if (!nav) { - nav = navigator; - } - if (nav.product === "ReactNative") { - return true; - } - const a = nav.userAgent || nav.vendor || (typeof window !== "undefined" ? window.opera : ""); - if (!a) { - const navAny = nav; - return navAny.userAgentData && navAny.userAgentData.mobile; - } - return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)); - } - return false; - } - function isBrowser() { - return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; - } - var ENV2 = env(); - ENV2.registerFlag("DEBUG", () => false, (debugValue) => { - if (debugValue) { - console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); - } - }); - ENV2.registerFlag("IS_BROWSER", () => isBrowser()); - ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); - ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); - ENV2.registerFlag("PROD", () => false); - ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); - ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); - ENV2.registerFlag("IS_TEST", () => false); - ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); - ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); - function inferShape(val, dtype) { - let firstElem = val; - if (isTypedArray(val)) { - return dtype === "string" ? [] : [val.length]; - } - if (!Array.isArray(val)) { - return []; - } - const shape = []; - while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { - shape.push(firstElem.length); - firstElem = firstElem[0]; - } - if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { - deepAssertShapeConsistency(val, shape, []); - } - return shape; - } - function deepAssertShapeConsistency(val, shape, indices) { - indices = indices || []; - if (!Array.isArray(val) && !isTypedArray(val)) { - assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); - return; - } - assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); - assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); - const subShape = shape.slice(1); - for (let i = 0; i < val.length; ++i) { - deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); - } - } - function assertDtype(expectedDtype, actualDType, argName, functionName) { - if (expectedDtype === "string_or_numeric") { - return; - } - if (expectedDtype == null) { - throw new Error(`Expected dtype cannot be null.`); - } - if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { - throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); - } - } - function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { - if (x instanceof Tensor) { - assertDtype(parseAsDtype, x.dtype, argName, functionName); - return x; - } - let inferredDtype = inferDtype(x); - if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { - inferredDtype = parseAsDtype; - } - assertDtype(parseAsDtype, inferredDtype, argName, functionName); - if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { - const type = x == null ? "null" : x.constructor.name; - throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); - } - const inferredShape = inferShape(x, inferredDtype); - if (!isTypedArray(x) && !Array.isArray(x)) { - x = [x]; - } - const skipTypedArray = true; - const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); - return ENGINE.makeTensor(values, inferredShape, inferredDtype); - } - function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { - if (!Array.isArray(arg)) { - throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); - } - const tensors = arg; - return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype)); - } - var OP_SCOPE_SUFFIX = "__op"; - function op(f) { - const keys = Object.keys(f); - if (keys.length !== 1) { - throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); - } - let opName = keys[0]; - const fn = f[opName]; - if (opName.endsWith("_")) { - opName = opName.substring(0, opName.length - 1); - } - opName = opName + OP_SCOPE_SUFFIX; - const f2 = (...args) => { - ENGINE.startScope(opName); - try { - const result = fn(...args); - if (isPromise(result)) { - console.error("Cannot return a Promise inside of tidy."); - } - ENGINE.endScope(result); - return result; - } catch (ex) { - ENGINE.endScope(null); - throw ex; - } - }; - Object.defineProperty(f2, "name", { value: opName, configurable: true }); - return f2; - } - function complex_(real4, imag4) { - const $real = convertToTensor(real4, "real", "complex"); - const $imag = convertToTensor(imag4, "imag", "complex"); - assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); - const inputs = { real: $real, imag: $imag }; - return ENGINE.runKernel(Complex, inputs); - } - var complex = op({ complex_ }); - function makeTensor(values, shape, inferredShape, dtype) { - if (dtype == null) { - dtype = inferDtype(values); - } - if (dtype === "complex64") { - throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); - } - if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "string") { - throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); - } - if (shape != null) { - assertNonNegativeIntegerDimensions(shape); - const providedSize = sizeFromShape(shape); - const inferredSize = sizeFromShape(inferredShape); - assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); - for (let i = 0; i < inferredShape.length; ++i) { - const inferred = inferredShape[i]; - const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; - assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); - } - } - if (!isTypedArray(values) && !Array.isArray(values)) { - values = [values]; - } - shape = shape || inferredShape; - values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); - return ENGINE.makeTensor(values, shape, dtype); - } - function tensor(values, shape, dtype) { - const inferredShape = inferShape(values, dtype); - return makeTensor(values, shape, inferredShape, dtype); - } - var DTYPE_VALUE_SIZE_MAP = { - "float32": 4, - "float16": 2, - "int32": 4, - "uint16": 2, - "uint8": 1, - "bool": 1, - "complex64": 8 - }; - var NUM_BYTES_STRING_LENGTH = 4; - async function encodeWeights(tensors, group) { - const specs = []; - const dataPromises = []; - const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors); - for (let i = 0; i < names.length; ++i) { - const name = names[i]; - const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; - if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { - throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); - } - const spec = { name, shape: t.shape, dtype: t.dtype }; - if (t.dtype === "string") { - const utf8bytes = new Promise(async (resolve) => { - const vals = await t.bytes(); - const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; - const bytes = new Uint8Array(totalNumBytes); - let offset = 0; - for (let i2 = 0; i2 < vals.length; i2++) { - const val = vals[i2]; - const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); - bytes.set(bytesOfLength, offset); - offset += NUM_BYTES_STRING_LENGTH; - bytes.set(val, offset); - offset += val.length; - } - resolve(bytes); - }); - dataPromises.push(utf8bytes); - } else { - dataPromises.push(t.data()); - } - if (group != null) { - spec.group = group; - } - specs.push(spec); - } - const tensorValues = await Promise.all(dataPromises); - return { data: concatenateTypedArrays(tensorValues), specs }; - } - function decodeWeights(buffer2, specs) { - const out = {}; - let float16Decode; - let offset = 0; - for (const spec of specs) { - const name = spec.name; - const dtype = spec.dtype; - const shape = spec.shape; - const size = sizeFromShape(shape); - let values; - if ("quantization" in spec) { - const quantization = spec.quantization; - if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { - if (!("min" in quantization && "scale" in quantization)) { - throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); - } - } else if (quantization.dtype === "float16") { - if (dtype !== "float32") { - throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); - } - } else { - throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); - } - const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; - const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor); - const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); - if (dtype === "float32") { - if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { - values = new Float32Array(quantizedArray.length); - for (let i = 0; i < quantizedArray.length; i++) { - const v = quantizedArray[i]; - values[i] = v * quantization.scale + quantization.min; - } - } else if (quantization.dtype === "float16") { - if (float16Decode === void 0) { - float16Decode = getFloat16Decoder(); - } - values = float16Decode(quantizedArray); - } else { - throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); - } - } else if (dtype === "int32") { - if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { - throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); - } - values = new Int32Array(quantizedArray.length); - for (let i = 0; i < quantizedArray.length; i++) { - const v = quantizedArray[i]; - values[i] = Math.round(v * quantization.scale + quantization.min); - } - } else { - throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); - } - offset += size * quantizationSizeFactor; - } else if (dtype === "string") { - const size2 = sizeFromShape(spec.shape); - values = []; - for (let i = 0; i < size2; i++) { - const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; - offset += NUM_BYTES_STRING_LENGTH; - const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); - values.push(bytes); - offset += byteLength; - } - } else { - const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; - const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor); - if (dtype === "float32") { - values = new Float32Array(byteBuffer); - } else if (dtype === "int32") { - values = new Int32Array(byteBuffer); - } else if (dtype === "bool") { - values = new Uint8Array(byteBuffer); - } else if (dtype === "complex64") { - values = new Float32Array(byteBuffer); - const real4 = new Float32Array(values.length / 2); - const image3 = new Float32Array(values.length / 2); - for (let i = 0; i < real4.length; i++) { - real4[i] = values[i * 2]; - image3[i] = values[i * 2 + 1]; - } - const realTensor = tensor(real4, shape, "float32"); - const imageTensor = tensor(image3, shape, "float32"); - out[name] = complex(realTensor, imageTensor); - realTensor.dispose(); - imageTensor.dispose(); - } else { - throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); - } - offset += size * dtypeFactor; - } - if (dtype !== "complex64") { - out[name] = tensor(values, shape, dtype); - } - } - return out; - } - function concatenateTypedArrays(xs) { - if (xs === null) { - throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); - } - let totalByteLength = 0; - const normalizedXs = []; - xs.forEach((x) => { - totalByteLength += x.byteLength; - normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); - if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { - throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); - } - }); - const y = new Uint8Array(totalByteLength); - let offset = 0; - normalizedXs.forEach((x) => { - y.set(new Uint8Array(x.buffer), offset); - offset += x.byteLength; - }); - return y.buffer; - } - var useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); - function stringByteLength(str) { - if (useNodeBuffer) { - return Buffer.byteLength(str); - } - return new Blob([str]).size; - } - function arrayBufferToBase64String(buffer2) { - if (useNodeBuffer) { - return Buffer.from(buffer2).toString("base64"); - } - const buf = new Uint8Array(buffer2); - let s = ""; - for (let i = 0, l = buf.length; i < l; i++) { - s += String.fromCharCode(buf[i]); - } - return btoa(s); - } - function base64StringToArrayBuffer(str) { - if (useNodeBuffer) { - const buf = Buffer.from(str, "base64"); - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); - } - const s = atob(str); - const buffer2 = new Uint8Array(s.length); - for (let i = 0; i < s.length; ++i) { - buffer2.set([s.charCodeAt(i)], i); - } - return buffer2.buffer; - } - function concatenateArrayBuffers(buffers) { - if (buffers.length === 1) { - return buffers[0]; - } - let totalByteLength = 0; - buffers.forEach((buffer2) => { - totalByteLength += buffer2.byteLength; - }); - const temp = new Uint8Array(totalByteLength); - let offset = 0; - buffers.forEach((buffer2) => { - temp.set(new Uint8Array(buffer2), offset); - offset += buffer2.byteLength; - }); - return temp.buffer; - } - function basename(path) { - const SEPARATOR = "/"; - path = path.trim(); - while (path.endsWith(SEPARATOR)) { - path = path.slice(0, path.length - 1); - } - const items = path.split(SEPARATOR); - return items[items.length - 1]; - } - function getModelJSONForModelArtifacts(artifacts, manifest) { - const result = { - modelTopology: artifacts.modelTopology, - format: artifacts.format, - generatedBy: artifacts.generatedBy, - convertedBy: artifacts.convertedBy, - weightsManifest: manifest - }; - if (artifacts.signature != null) { - result.signature = artifacts.signature; - } - if (artifacts.userDefinedMetadata != null) { - result.userDefinedMetadata = artifacts.userDefinedMetadata; - } - if (artifacts.modelInitializer != null) { - result.modelInitializer = artifacts.modelInitializer; - } - if (artifacts.trainingConfig != null) { - result.trainingConfig = artifacts.trainingConfig; - } - return result; - } - async function getModelArtifactsForJSON(modelJSON, loadWeights2) { - const modelArtifacts = { - modelTopology: modelJSON.modelTopology, - format: modelJSON.format, - generatedBy: modelJSON.generatedBy, - convertedBy: modelJSON.convertedBy - }; - if (modelJSON.trainingConfig != null) { - modelArtifacts.trainingConfig = modelJSON.trainingConfig; - } - if (modelJSON.weightsManifest != null) { - const [weightSpecs, weightData] = await loadWeights2(modelJSON.weightsManifest); - modelArtifacts.weightSpecs = weightSpecs; - modelArtifacts.weightData = weightData; - } - if (modelJSON.signature != null) { - modelArtifacts.signature = modelJSON.signature; - } - if (modelJSON.userDefinedMetadata != null) { - modelArtifacts.userDefinedMetadata = modelJSON.userDefinedMetadata; - } - if (modelJSON.modelInitializer != null) { - modelArtifacts.modelInitializer = modelJSON.modelInitializer; - } - return modelArtifacts; - } - function getModelArtifactsInfoForJSON(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("Expected JSON model topology, received ArrayBuffer."); - } - return { - dateSaved: new Date(), - modelTopologyType: "JSON", - modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), - weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), - weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength - }; - } - function computeFloat16MantisaTable() { - const convertMantissa = (i) => { - let m = i << 13; - let e = 0; - while ((m & 8388608) === 0) { - e -= 8388608; - m <<= 1; - } - m &= ~8388608; - e += 947912704; - return m | e; - }; - const mantisaTable = new Uint32Array(2048); - mantisaTable[0] = 0; - for (let i = 1; i < 1024; i++) { - mantisaTable[i] = convertMantissa(i); - } - for (let i = 1024; i < 2048; i++) { - mantisaTable[i] = 939524096 + (i - 1024 << 13); - } - return mantisaTable; - } - function computeFloat16ExponentTable() { - const exponentTable = new Uint32Array(64); - exponentTable[0] = 0; - exponentTable[31] = 1199570944; - exponentTable[32] = 2147483648; - exponentTable[63] = 3347054592; - for (let i = 1; i < 31; i++) { - exponentTable[i] = i << 23; - } - for (let i = 33; i < 63; i++) { - exponentTable[i] = 2147483648 + (i - 32 << 23); - } - return exponentTable; - } - function computeFloat16OffsetTable() { - const offsetTable = new Uint32Array(64); - for (let i = 0; i < 64; i++) { - offsetTable[i] = 1024; - } - offsetTable[0] = offsetTable[32] = 0; - return offsetTable; - } - function getFloat16Decoder() { - const mantisaTable = computeFloat16MantisaTable(); - const exponentTable = computeFloat16ExponentTable(); - const offsetTable = computeFloat16OffsetTable(); - return (quantizedArray) => { - const buffer2 = new ArrayBuffer(4 * quantizedArray.length); - const bufferUint32View = new Uint32Array(buffer2); - for (let index = 0; index < quantizedArray.length; index++) { - const float16Bits = quantizedArray[index]; - const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; - bufferUint32View[index] = float32Bits; - } - return new Float32Array(buffer2); - }; - } - var IORouterRegistry = class { - constructor() { - this.saveRouters = []; - this.loadRouters = []; - } - static getInstance() { - if (IORouterRegistry.instance == null) { - IORouterRegistry.instance = new IORouterRegistry(); - } - return IORouterRegistry.instance; - } - static registerSaveRouter(saveRouter) { - IORouterRegistry.getInstance().saveRouters.push(saveRouter); - } - static registerLoadRouter(loadRouter) { - IORouterRegistry.getInstance().loadRouters.push(loadRouter); - } - static getSaveHandlers(url) { - return IORouterRegistry.getHandlers(url, "save"); - } - static getLoadHandlers(url, loadOptions) { - return IORouterRegistry.getHandlers(url, "load", loadOptions); - } - static getHandlers(url, handlerType, loadOptions) { - const validHandlers = []; - const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; - routers.forEach((router) => { - const handler = router(url, loadOptions); - if (handler !== null) { - validHandlers.push(handler); - } - }); - return validHandlers; - } - }; - var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); - var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); - var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); - var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); - var DATABASE_NAME = "tensorflowjs"; - var DATABASE_VERSION = 1; - var MODEL_STORE_NAME = "models_store"; - var INFO_STORE_NAME = "model_info_store"; - function getIndexedDBFactory() { - if (!env().getBool("IS_BROWSER")) { - throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); - } - const theWindow = typeof window === "undefined" ? self : window; - const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; - if (factory == null) { - throw new Error("The current browser does not appear to support IndexedDB."); - } - return factory; - } - function setUpDatabase(openRequest) { - const db = openRequest.result; - db.createObjectStore(MODEL_STORE_NAME, { keyPath: "modelPath" }); - db.createObjectStore(INFO_STORE_NAME, { keyPath: "modelPath" }); - } - var BrowserIndexedDB = class { - constructor(modelPath) { - this.indexedDB = getIndexedDBFactory(); - if (modelPath == null || !modelPath) { - throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); - } - this.modelPath = modelPath; - } - async save(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); - } - return this.databaseAction(this.modelPath, modelArtifacts); - } - async load() { - return this.databaseAction(this.modelPath); - } - databaseAction(modelPath, modelArtifacts) { - return new Promise((resolve, reject) => { - const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = () => setUpDatabase(openRequest); - openRequest.onsuccess = () => { - const db = openRequest.result; - if (modelArtifacts == null) { - const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); - const modelStore = modelTx.objectStore(MODEL_STORE_NAME); - const getRequest = modelStore.get(this.modelPath); - getRequest.onsuccess = () => { - if (getRequest.result == null) { - db.close(); - return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); - } else { - resolve(getRequest.result.modelArtifacts); - } - }; - getRequest.onerror = (error) => { - db.close(); - return reject(getRequest.error); - }; - modelTx.oncomplete = () => db.close(); - } else { - const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); - const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); - let infoStore = infoTx.objectStore(INFO_STORE_NAME); - const putInfoRequest = infoStore.put({ modelPath: this.modelPath, modelArtifactsInfo }); - let modelTx; - putInfoRequest.onsuccess = () => { - modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); - const modelStore = modelTx.objectStore(MODEL_STORE_NAME); - const putModelRequest = modelStore.put({ - modelPath: this.modelPath, - modelArtifacts, - modelArtifactsInfo - }); - putModelRequest.onsuccess = () => resolve({ modelArtifactsInfo }); - putModelRequest.onerror = (error) => { - infoStore = infoTx.objectStore(INFO_STORE_NAME); - const deleteInfoRequest = infoStore.delete(this.modelPath); - deleteInfoRequest.onsuccess = () => { - db.close(); - return reject(putModelRequest.error); - }; - deleteInfoRequest.onerror = (error2) => { - db.close(); - return reject(putModelRequest.error); - }; - }; - }; - putInfoRequest.onerror = (error) => { - db.close(); - return reject(putInfoRequest.error); - }; - infoTx.oncomplete = () => { - if (modelTx == null) { - db.close(); - } else { - modelTx.oncomplete = () => db.close(); - } - }; - } - }; - openRequest.onerror = (error) => reject(openRequest.error); - }); - } - }; - BrowserIndexedDB.URL_SCHEME = "indexeddb://"; - var indexedDBRouter = (url) => { - if (!env().getBool("IS_BROWSER")) { - return null; - } else { - if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { - return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); - } else { - return null; - } - } - }; - IORouterRegistry.registerSaveRouter(indexedDBRouter); - IORouterRegistry.registerLoadRouter(indexedDBRouter); - function browserIndexedDB(modelPath) { - return new BrowserIndexedDB(modelPath); - } - function maybeStripScheme(key) { - return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; - } - var BrowserIndexedDBManager = class { - constructor() { - this.indexedDB = getIndexedDBFactory(); - } - async listModels() { - return new Promise((resolve, reject) => { - const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = () => setUpDatabase(openRequest); - openRequest.onsuccess = () => { - const db = openRequest.result; - const tx = db.transaction(INFO_STORE_NAME, "readonly"); - const store = tx.objectStore(INFO_STORE_NAME); - const getAllInfoRequest = store.getAll(); - getAllInfoRequest.onsuccess = () => { - const out = {}; - for (const item of getAllInfoRequest.result) { - out[item.modelPath] = item.modelArtifactsInfo; - } - resolve(out); - }; - getAllInfoRequest.onerror = (error) => { - db.close(); - return reject(getAllInfoRequest.error); - }; - tx.oncomplete = () => db.close(); - }; - openRequest.onerror = (error) => reject(openRequest.error); - }); - } - async removeModel(path) { - path = maybeStripScheme(path); - return new Promise((resolve, reject) => { - const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = () => setUpDatabase(openRequest); - openRequest.onsuccess = () => { - const db = openRequest.result; - const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); - const infoStore = infoTx.objectStore(INFO_STORE_NAME); - const getInfoRequest = infoStore.get(path); - let modelTx; - getInfoRequest.onsuccess = () => { - if (getInfoRequest.result == null) { - db.close(); - return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); - } else { - const deleteInfoRequest = infoStore.delete(path); - const deleteModelData = () => { - modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); - const modelStore = modelTx.objectStore(MODEL_STORE_NAME); - const deleteModelRequest = modelStore.delete(path); - deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); - deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); - }; - deleteInfoRequest.onsuccess = deleteModelData; - deleteInfoRequest.onerror = (error) => { - deleteModelData(); - db.close(); - return reject(getInfoRequest.error); - }; - } - }; - getInfoRequest.onerror = (error) => { - db.close(); - return reject(getInfoRequest.error); - }; - infoTx.oncomplete = () => { - if (modelTx == null) { - db.close(); - } else { - modelTx.oncomplete = () => db.close(); - } - }; - }; - openRequest.onerror = (error) => reject(openRequest.error); - }); - } - }; - var PATH_SEPARATOR = "/"; - var PATH_PREFIX = "tensorflowjs_models"; - var INFO_SUFFIX = "info"; - var MODEL_TOPOLOGY_SUFFIX = "model_topology"; - var WEIGHT_SPECS_SUFFIX = "weight_specs"; - var WEIGHT_DATA_SUFFIX = "weight_data"; - var MODEL_METADATA_SUFFIX = "model_metadata"; - function getModelKeys(path) { - return { - info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), - topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), - weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), - weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), - modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) - }; - } - function removeItems(keys) { - for (const key of Object.values(keys)) { - window.localStorage.removeItem(key); - } - } - function getModelPathFromKey(key) { - const items = key.split(PATH_SEPARATOR); - if (items.length < 3) { - throw new Error(`Invalid key format: ${key}`); - } - return items.slice(1, items.length - 1).join(PATH_SEPARATOR); - } - function maybeStripScheme2(key) { - return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; - } - var BrowserLocalStorage = class { - constructor(modelPath) { - if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { - throw new Error("The current environment does not support local storage."); - } - this.LS = window.localStorage; - if (modelPath == null || !modelPath) { - throw new Error("For local storage, modelPath must not be null, undefined or empty."); - } - this.modelPath = modelPath; - this.keys = getModelKeys(this.modelPath); - } - async save(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); - } else { - const topology = JSON.stringify(modelArtifacts.modelTopology); - const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); - const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); - try { - this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); - this.LS.setItem(this.keys.topology, topology); - this.LS.setItem(this.keys.weightSpecs, weightSpecs); - this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); - const metadata = { - format: modelArtifacts.format, - generatedBy: modelArtifacts.generatedBy, - convertedBy: modelArtifacts.convertedBy, - signature: modelArtifacts.signature != null ? modelArtifacts.signature : void 0, - userDefinedMetadata: modelArtifacts.userDefinedMetadata != null ? modelArtifacts.userDefinedMetadata : void 0, - modelInitializer: modelArtifacts.modelInitializer != null ? modelArtifacts.modelInitializer : void 0, - trainingConfig: modelArtifacts.trainingConfig != null ? modelArtifacts.trainingConfig : void 0 - }; - this.LS.setItem(this.keys.modelMetadata, JSON.stringify(metadata)); - return { modelArtifactsInfo }; - } catch (err) { - removeItems(this.keys); - throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); - } - } - } - async load() { - const info = JSON.parse(this.LS.getItem(this.keys.info)); - if (info == null) { - throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); - } - if (info.modelTopologyType !== "JSON") { - throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); - } - const out = {}; - const topology = JSON.parse(this.LS.getItem(this.keys.topology)); - if (topology == null) { - throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); - } - out.modelTopology = topology; - const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); - if (weightSpecs == null) { - throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); - } - out.weightSpecs = weightSpecs; - const metadataString = this.LS.getItem(this.keys.modelMetadata); - if (metadataString != null) { - const metadata = JSON.parse(metadataString); - out.format = metadata.format; - out.generatedBy = metadata.generatedBy; - out.convertedBy = metadata.convertedBy; - if (metadata.signature != null) { - out.signature = metadata.signature; - } - if (metadata.userDefinedMetadata != null) { - out.userDefinedMetadata = metadata.userDefinedMetadata; - } - if (metadata.modelInitializer != null) { - out.modelInitializer = metadata.modelInitializer; - } - if (metadata.trainingConfig != null) { - out.trainingConfig = metadata.trainingConfig; - } - } - const weightDataBase64 = this.LS.getItem(this.keys.weightData); - if (weightDataBase64 == null) { - throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); - } - out.weightData = base64StringToArrayBuffer(weightDataBase64); - return out; - } - }; - BrowserLocalStorage.URL_SCHEME = "localstorage://"; - var localStorageRouter = (url) => { - if (!env().getBool("IS_BROWSER")) { - return null; - } else { - if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { - return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); - } else { - return null; - } - } - }; - IORouterRegistry.registerSaveRouter(localStorageRouter); - IORouterRegistry.registerLoadRouter(localStorageRouter); - function browserLocalStorage(modelPath) { - return new BrowserLocalStorage(modelPath); - } - var BrowserLocalStorageManager = class { - constructor() { - assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); - assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); - this.LS = window.localStorage; - } - async listModels() { - const out = {}; - const prefix = PATH_PREFIX + PATH_SEPARATOR; - const suffix = PATH_SEPARATOR + INFO_SUFFIX; - for (let i = 0; i < this.LS.length; ++i) { - const key = this.LS.key(i); - if (key.startsWith(prefix) && key.endsWith(suffix)) { - const modelPath = getModelPathFromKey(key); - out[modelPath] = JSON.parse(this.LS.getItem(key)); - } - } - return out; - } - async removeModel(path) { - path = maybeStripScheme2(path); - const keys = getModelKeys(path); - if (this.LS.getItem(keys.info) == null) { - throw new Error(`Cannot find model at path '${path}'`); - } - const info = JSON.parse(this.LS.getItem(keys.info)); - removeItems(keys); - return info; - } - }; - var URL_SCHEME_SUFFIX = "://"; - var ModelStoreManagerRegistry = class { - constructor() { - this.managers = {}; - } - static getInstance() { - if (ModelStoreManagerRegistry.instance == null) { - ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); - } - return ModelStoreManagerRegistry.instance; - } - static registerManager(scheme, manager) { - assert(scheme != null, () => "scheme must not be undefined or null."); - if (scheme.endsWith(URL_SCHEME_SUFFIX)) { - scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); - } - assert(scheme.length > 0, () => "scheme must not be an empty string."); - const registry = ModelStoreManagerRegistry.getInstance(); - assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); - registry.managers[scheme] = manager; - } - static getManager(scheme) { - const manager = this.getInstance().managers[scheme]; - if (manager == null) { - throw new Error(`Cannot find model manager for scheme '${scheme}'`); - } - return manager; - } - static getSchemes() { - return Object.keys(this.getInstance().managers); - } - }; - function parseURL(url) { - if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { - throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); - } - return { - scheme: url.split(URL_SCHEME_SUFFIX)[0], - path: url.split(URL_SCHEME_SUFFIX)[1] - }; - } - async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { - assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); - const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); - assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); - assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); - const loadHandler = loadHandlers[0]; - const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); - assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); - assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); - const saveHandler = saveHandlers[0]; - const sourceScheme = parseURL(sourceURL).scheme; - const sourcePath = parseURL(sourceURL).path; - const sameMedium = sourceScheme === parseURL(sourceURL).scheme; - const modelArtifacts = await loadHandler.load(); - if (deleteSource && sameMedium) { - await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); - } - const saveResult = await saveHandler.save(modelArtifacts); - if (deleteSource && !sameMedium) { - await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); - } - return saveResult.modelArtifactsInfo; - } - async function listModels() { - const schemes = ModelStoreManagerRegistry.getSchemes(); - const out = {}; - for (const scheme of schemes) { - const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); - for (const path in schemeOut) { - const url = scheme + URL_SCHEME_SUFFIX + path; - out[url] = schemeOut[path]; - } - } - return out; - } - async function removeModel(url) { - const schemeAndPath = parseURL(url); - const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); - return manager.removeModel(schemeAndPath.path); - } - async function copyModel(sourceURL, destURL) { - const deleteSource = false; - return cloneModelInternal(sourceURL, destURL, deleteSource); - } - async function moveModel(sourceURL, destURL) { - const deleteSource = true; - return cloneModelInternal(sourceURL, destURL, deleteSource); - } - var PlatformBrowser = class { - fetch(path, init2) { - return fetch(path, init2); - } - now() { - return performance.now(); - } - encode(text, encoding) { - if (encoding !== "utf-8" && encoding !== "utf8") { - throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); - } - if (this.textEncoder == null) { - this.textEncoder = new TextEncoder(); - } - return this.textEncoder.encode(text); - } - decode(bytes, encoding) { - return new TextDecoder(encoding).decode(bytes); - } - }; - if (env().get("IS_BROWSER")) { - env().setPlatform("browser", new PlatformBrowser()); - try { - ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); - } catch (err) { - } - try { - ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); - } catch (err) { - } - } - var getNodeFetch = { - importFetch: () => require_browser() - }; - var systemFetch; - var PlatformNode = class { - constructor() { - this.util = __require2("util"); - this.textEncoder = new this.util.TextEncoder(); - } - fetch(path, requestInits) { - if (env().global.fetch != null) { - return env().global.fetch(path, requestInits); - } - if (systemFetch == null) { - systemFetch = getNodeFetch.importFetch(); - } - return systemFetch(path, requestInits); - } - now() { - const time2 = process.hrtime(); - return time2[0] * 1e3 + time2[1] / 1e6; - } - encode(text, encoding) { - if (encoding !== "utf-8" && encoding !== "utf8") { - throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); - } - return this.textEncoder.encode(text); - } - decode(bytes, encoding) { - if (bytes.length === 0) { - return ""; - } - return new this.util.TextDecoder(encoding).decode(bytes); - } - }; - if (env().get("IS_NODE")) { - env().setPlatform("node", new PlatformNode()); - } - function buffer(shape, dtype = "float32", values) { - dtype = dtype || "float32"; - assertNonNegativeIntegerDimensions(shape); - return new TensorBuffer(shape, dtype, values); - } - function cast_(x, dtype) { - const $x = convertToTensor(x, "x", "cast"); - if (!isValidDtype(dtype)) { - throw new Error(`Failed to cast to unknown dtype ${dtype}`); - } - if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { - throw new Error("Only strings can be casted to strings"); - } - const inputs = { x: $x }; - const attrs = { dtype }; - return ENGINE.runKernel(Cast, inputs, attrs); - } - var cast = op({ cast_ }); - function clone_(x) { - const $x = convertToTensor(x, "x", "clone", "string_or_numeric"); - const inputs = { x: $x }; - return ENGINE.runKernel(Identity, inputs); - } - var clone = op({ clone_ }); - function print2(x, verbose = false) { - console.log(x.toString(verbose)); - } - getOrMakeEngine(); - var opHandler2 = { - buffer, - cast, - clone, - print: print2 - }; - setOpHandler(opHandler2); - var io_exports = {}; - __export2(io_exports, { - browserFiles: () => browserFiles, - browserHTTPRequest: () => browserHTTPRequest, - concatenateArrayBuffers: () => concatenateArrayBuffers, - copyModel: () => copyModel, - decodeWeights: () => decodeWeights, - encodeWeights: () => encodeWeights, - fromMemory: () => fromMemory, - getLoadHandlers: () => getLoadHandlers, - getModelArtifactsForJSON: () => getModelArtifactsForJSON, - getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, - getSaveHandlers: () => getSaveHandlers, - http: () => http, - isHTTPScheme: () => isHTTPScheme, - listModels: () => listModels, - loadWeights: () => loadWeights, - moveModel: () => moveModel, - registerLoadRouter: () => registerLoadRouter, - registerSaveRouter: () => registerSaveRouter, - removeModel: () => removeModel, - weightsLoaderFactory: () => weightsLoaderFactory, - withSaveHandler: () => withSaveHandler - }); - var DEFAULT_FILE_NAME_PREFIX = "model"; - var DEFAULT_JSON_EXTENSION_NAME = ".json"; - var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; - function defer(f) { - return new Promise((resolve) => setTimeout(resolve)).then(f); - } - var BrowserDownloads = class { - constructor(fileNamePrefix) { - if (!env().getBool("IS_BROWSER")) { - throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); - } - if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { - fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); - } - if (fileNamePrefix == null || fileNamePrefix.length === 0) { - fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; - } - this.modelJsonFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; - this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; - } - async save(modelArtifacts) { - if (typeof document === "undefined") { - throw new Error("Browser downloads are not supported in this environment since `document` is not present"); - } - const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: "application/octet-stream" })); - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); - } else { - const weightsManifest = [{ - paths: ["./" + this.weightDataFileName], - weights: modelArtifacts.weightSpecs - }]; - const modelJSON = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest); - const modelJsonURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelJSON)], { type: "application/json" })); - const jsonAnchor = this.modelJsonAnchor == null ? document.createElement("a") : this.modelJsonAnchor; - jsonAnchor.download = this.modelJsonFileName; - jsonAnchor.href = modelJsonURL; - await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); - if (modelArtifacts.weightData != null) { - const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; - weightDataAnchor.download = this.weightDataFileName; - weightDataAnchor.href = weightsURL; - await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); - } - return { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts) }; - } - } - }; - BrowserDownloads.URL_SCHEME = "downloads://"; - var BrowserFiles = class { - constructor(files) { - if (files == null || files.length < 1) { - throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); - } - this.jsonFile = files[0]; - this.weightsFiles = files.slice(1); - } - async load() { - return new Promise((resolve, reject) => { - const jsonReader = new FileReader(); - jsonReader.onload = (event) => { - const modelJSON = JSON.parse(event.target.result); - const modelTopology = modelJSON.modelTopology; - if (modelTopology == null) { - reject(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`)); - return; - } - const weightsManifest = modelJSON.weightsManifest; - if (weightsManifest == null) { - reject(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`)); - return; - } - if (this.weightsFiles.length === 0) { - resolve({ modelTopology }); - return; - } - const modelArtifactsPromise = getModelArtifactsForJSON(modelJSON, (weightsManifest2) => this.loadWeights(weightsManifest2)); - resolve(modelArtifactsPromise); - }; - jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); - jsonReader.readAsText(this.jsonFile); - }); - } - loadWeights(weightsManifest) { - const weightSpecs = []; - const paths = []; - for (const entry of weightsManifest) { - weightSpecs.push(...entry.weights); - paths.push(...entry.paths); - } - const pathToFile = this.checkManifestAndWeightFiles(weightsManifest); - const promises = paths.map((path) => this.loadWeightsFile(path, pathToFile[path])); - return Promise.all(promises).then((buffers) => [weightSpecs, concatenateArrayBuffers(buffers)]); - } - loadWeightsFile(path, file) { - return new Promise((resolve, reject) => { - const weightFileReader = new FileReader(); - weightFileReader.onload = (event) => { - const weightData = event.target.result; - resolve(weightData); - }; - weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); - weightFileReader.readAsArrayBuffer(file); - }); - } - checkManifestAndWeightFiles(manifest) { - const basenames = []; - const fileNames = this.weightsFiles.map((file) => basename(file.name)); - const pathToFile = {}; - for (const group of manifest) { - group.paths.forEach((path) => { - const pathBasename = basename(path); - if (basenames.indexOf(pathBasename) !== -1) { - throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); - } - basenames.push(pathBasename); - if (fileNames.indexOf(pathBasename) === -1) { - throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); - } else { - pathToFile[path] = this.weightsFiles[fileNames.indexOf(pathBasename)]; - } - }); - } - if (basenames.length !== this.weightsFiles.length) { - throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${this.weightsFiles.length}).`); - } - return pathToFile; - } - }; - var browserDownloadsRouter = (url) => { - if (!env().getBool("IS_BROWSER")) { - return null; - } else { - if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { - return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); - } else { - return null; - } - } - }; - IORouterRegistry.registerSaveRouter(browserDownloadsRouter); - function browserDownloads(fileNamePrefix = "model") { - return new BrowserDownloads(fileNamePrefix); - } - function browserFiles(files) { - return new BrowserFiles(files); - } - function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { - checkPromises(promises); - startFraction = startFraction == null ? 0 : startFraction; - endFraction = endFraction == null ? 1 : endFraction; - checkFraction(startFraction, endFraction); - let resolvedPromise = 0; - const registerMonitor = (promise) => { - promise.then((value) => { - const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); - onProgress(fraction); - return value; - }); - return promise; - }; - function checkPromises(promises2) { - assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); - } - function checkFraction(startFraction2, endFraction2) { - assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); - assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); - assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); - } - return Promise.all(promises.map(registerMonitor)); - } - async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { - if (loadOptions == null) { - loadOptions = {}; - } - const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; - const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, { isBinary: true })); - const fetchStartFraction = 0; - const fetchEndFraction = 0.5; - const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); - const bufferPromises = responses.map((response) => response.arrayBuffer()); - const bufferStartFraction = 0.5; - const bufferEndFraction = 1; - const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); - return buffers; - } - async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { - const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, { requestInit }); - const loadWeights2 = weightsLoaderFactory(fetchWeights); - return loadWeights2(manifest, filePathPrefix, weightNames); - } - function weightsLoaderFactory(fetchWeightsFunction) { - return async (manifest, filePathPrefix = "", weightNames) => { - const groupIndicesToFetchMap = manifest.map(() => false); - const groupWeightsToFetch = {}; - const weightsFound = weightNames != null ? weightNames.map(() => false) : []; - const allManifestWeightNames = []; - manifest.forEach((manifestGroupConfig, groupIndex) => { - let groupOffset = 0; - manifestGroupConfig.weights.forEach((weightsEntry) => { - const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; - const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); - const enqueueWeightsForFetchingFn = () => { - groupIndicesToFetchMap[groupIndex] = true; - if (groupWeightsToFetch[groupIndex] == null) { - groupWeightsToFetch[groupIndex] = []; - } - groupWeightsToFetch[groupIndex].push({ - manifestEntry: weightsEntry, - groupOffset, - sizeBytes: weightsBytes - }); - }; - if (weightNames != null) { - weightNames.forEach((weightName, weightIndex) => { - if (weightName === weightsEntry.name) { - enqueueWeightsForFetchingFn(); - weightsFound[weightIndex] = true; - } - }); - } else { - enqueueWeightsForFetchingFn(); - } - allManifestWeightNames.push(weightsEntry.name); - groupOffset += weightsBytes; - }); - }); - if (!weightsFound.every((found) => found)) { - const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); - throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. -Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); - } - const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { - if (shouldFetch) { - accumulator.push(i); - } - return accumulator; - }, []); - const fetchUrls = []; - groupIndicesToFetch.forEach((i) => { - manifest[i].paths.forEach((filepath) => { - const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; - fetchUrls.push(fetchUrl); - }); - }); - const buffers = await fetchWeightsFunction(fetchUrls); - const weightsTensorMap = {}; - let bufferIndexOffset = 0; - groupIndicesToFetch.forEach((i) => { - const numBuffers = manifest[i].paths.length; - let groupBytes = 0; - for (let i2 = 0; i2 < numBuffers; i2++) { - groupBytes += buffers[bufferIndexOffset + i2].byteLength; - } - const groupBuffer = new ArrayBuffer(groupBytes); - const groupByteBuffer = new Uint8Array(groupBuffer); - let groupBufferOffset = 0; - for (let i2 = 0; i2 < numBuffers; i2++) { - const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); - groupByteBuffer.set(buffer2, groupBufferOffset); - groupBufferOffset += buffer2.byteLength; - } - const weightsEntries = groupWeightsToFetch[i]; - weightsEntries.forEach((weightsEntry) => { - const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); - const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); - for (const name in nameToTensorMap) { - weightsTensorMap[name] = nameToTensorMap[name]; - } - }); - bufferIndexOffset += numBuffers; - }); - return weightsTensorMap; - }; - } - var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; - var JSON_TYPE = "application/json"; - var HTTPRequest = class { - constructor(path, loadOptions) { - this.DEFAULT_METHOD = "POST"; - if (loadOptions == null) { - loadOptions = {}; - } - this.weightPathPrefix = loadOptions.weightPathPrefix; - this.onProgress = loadOptions.onProgress; - this.weightUrlConverter = loadOptions.weightUrlConverter; - if (loadOptions.fetchFunc != null) { - assert(typeof loadOptions.fetchFunc === "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"); - this.fetch = loadOptions.fetchFunc; - } else { - this.fetch = env().platform.fetch; - } - assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); - if (Array.isArray(path)) { - assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); - } - this.path = path; - if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { - throw new Error("requestInit is expected to have no pre-existing body, but has one."); - } - this.requestInit = loadOptions.requestInit || {}; - } - async save(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); - } - const init2 = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit); - init2.body = new FormData(); - const weightsManifest = [{ - paths: ["./model.weights.bin"], - weights: modelArtifacts.weightSpecs - }]; - const modelTopologyAndWeightManifest = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest); - init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: JSON_TYPE }), "model.json"); - if (modelArtifacts.weightData != null) { - init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], { type: OCTET_STREAM_MIME_TYPE }), "model.weights.bin"); - } - const response = await this.fetch(this.path, init2); - if (response.ok) { - return { - modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), - responses: [response] - }; - } else { - throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); - } - } - async load() { - const modelConfigRequest = await this.fetch(this.path, this.requestInit); - if (!modelConfigRequest.ok) { - throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); - } - let modelJSON; - try { - modelJSON = await modelConfigRequest.json(); - } catch (e) { - let message = `Failed to parse model JSON of response from ${this.path}.`; - if (this.path.endsWith(".pb")) { - message += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository."; - } else { - message += " Please make sure the server is serving valid JSON for this request."; - } - throw new Error(message); - } - const modelTopology = modelJSON.modelTopology; - const weightsManifest = modelJSON.weightsManifest; - if (modelTopology == null && weightsManifest == null) { - throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); - } - return getModelArtifactsForJSON(modelJSON, (weightsManifest2) => this.loadWeights(weightsManifest2)); - } - async loadWeights(weightsManifest) { - const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; - const [prefix, suffix] = parseUrl(weightPath); - const pathPrefix = this.weightPathPrefix || prefix; - const weightSpecs = []; - for (const entry of weightsManifest) { - weightSpecs.push(...entry.weights); - } - const fetchURLs = []; - const urlPromises = []; - for (const weightsGroup of weightsManifest) { - for (const path of weightsGroup.paths) { - if (this.weightUrlConverter != null) { - urlPromises.push(this.weightUrlConverter(path)); - } else { - fetchURLs.push(pathPrefix + path + suffix); - } - } - } - if (this.weightUrlConverter) { - fetchURLs.push(...await Promise.all(urlPromises)); - } - const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { - requestInit: this.requestInit, - fetchFunc: this.fetch, - onProgress: this.onProgress - }); - return [weightSpecs, concatenateArrayBuffers(buffers)]; - } - }; - HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; - function parseUrl(url) { - const lastSlash = url.lastIndexOf("/"); - const lastSearchParam = url.lastIndexOf("?"); - const prefix = url.substring(0, lastSlash); - const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; - return [prefix + "/", suffix]; - } - function isHTTPScheme(url) { - return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; - } - var httpRouter = (url, loadOptions) => { - if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { - return null; - } else { - let isHTTP = true; - if (Array.isArray(url)) { - isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); - } else { - isHTTP = isHTTPScheme(url); - } - if (isHTTP) { - return http(url, loadOptions); - } - } - return null; - }; - IORouterRegistry.registerSaveRouter(httpRouter); - IORouterRegistry.registerLoadRouter(httpRouter); - function http(path, loadOptions) { - return new HTTPRequest(path, loadOptions); - } - function browserHTTPRequest(path, loadOptions) { - return http(path, loadOptions); - } - var PassthroughLoader = class { - constructor(modelArtifacts) { - this.modelArtifacts = modelArtifacts; - } - async load() { - return this.modelArtifacts; - } - }; - var PassthroughSaver = class { - constructor(saveHandler) { - this.saveHandler = saveHandler; - } - async save(modelArtifacts) { - return this.saveHandler(modelArtifacts); - } - }; - function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { - if (arguments.length === 1) { - const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; - if (isModelArtifacts) { - return new PassthroughLoader(modelArtifacts); - } else { - console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); - return new PassthroughLoader({ modelTopology: modelArtifacts }); - } - } else { - console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); - return new PassthroughLoader({ - modelTopology: modelArtifacts, - weightSpecs, - weightData, - trainingConfig - }); - } - } - function withSaveHandler(saveHandler) { - return new PassthroughSaver(saveHandler); - } - var math_exports = {}; - __export2(math_exports, { - confusionMatrix: () => confusionMatrix - }); - function matMul_(a, b, transposeA = false, transposeB = false) { - let $a = convertToTensor(a, "a", "matMul"); - let $b = convertToTensor(b, "b", "matMul"); - [$a, $b] = makeTypesMatch($a, $b); - const inputs = { a: $a, b: $b }; - const attrs = { transposeA, transposeB }; - return ENGINE.runKernel(BatchMatMul, inputs, attrs); - } - var matMul = op({ matMul_ }); - function oneHot_(indices, depth, onValue = 1, offValue = 0) { - if (depth < 2) { - throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); - } - const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); - const inputs = { indices: $indices }; - const attrs = { depth, onValue, offValue }; - return ENGINE.runKernel(OneHot, inputs, attrs); - } - var oneHot = op({ oneHot_ }); - function transpose_(x, perm) { - const $x = convertToTensor(x, "x", "transpose"); - if (perm == null) { - perm = $x.shape.map((s, i) => i).reverse(); - } - assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); - perm.forEach((axis) => { - assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); - }); - if ($x.rank <= 1) { - return $x.clone(); - } - const inputs = { x: $x }; - const attrs = { perm }; - return ENGINE.runKernel(Transpose, inputs, attrs); - } - var transpose = op({ transpose_ }); - function confusionMatrix_(labels, predictions, numClasses) { - const $labels = convertToTensor(labels, "labels", "confusionMatrix"); - const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); - assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); - assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); - assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); - assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); - assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); - const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); - const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); - const oneHotLabelsT = transpose(oneHotLabels); - const product = matMul(oneHotLabelsT, oneHotPredictions); - return cast(product, "int32"); - } - var confusionMatrix = op({ confusionMatrix_ }); - var browser_exports = {}; - __export2(browser_exports, { - fromPixels: () => fromPixels, - fromPixelsAsync: () => fromPixelsAsync, - toPixels: () => toPixels - }); - function tensor3d(values, shape, dtype) { - assertNonNull(values); - if (shape != null && shape.length !== 3) { - throw new Error("tensor3d() requires shape to have three numbers"); - } - const inferredShape = inferShape(values, dtype); - if (inferredShape.length !== 3 && inferredShape.length !== 1) { - throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); - } - if (inferredShape.length === 1 && shape == null) { - throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); - } - return makeTensor(values, shape, inferredShape, dtype); - } - var fromPixels2DContext; - function fromPixels_(pixels, numChannels = 3) { - if (numChannels > 4) { - throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); - } - if (pixels == null) { - throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); - } - let isPixelData2 = false; - let isImageData = false; - let isVideo = false; - let isImage = false; - let isCanvasLike = false; - let isImageBitmap = false; - if (pixels.data instanceof Uint8Array) { - isPixelData2 = true; - } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { - isImageData = true; - } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { - isVideo = true; - } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { - isImage = true; - } else if (pixels.getContext != null) { - isCanvasLike = true; - } else if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { - isImageBitmap = true; - } else { - throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`); - } - if (isVideo) { - const HAVE_CURRENT_DATA_READY_STATE = 2; - if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { - throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the