UNPKG

55.8 kBSource Map (JSON)View Raw
1{"version":3,"file":"engine_test.js","sourceRoot":"","sources":["../src/engine_test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\nimport {KernelBackend} from './backends/backend';\nimport {ENGINE} from './engine';\nimport * as tf from './index';\nimport {KernelFunc} from './index';\nimport {ALL_ENVS, describeWithFlags, TestKernelBackend} from './jasmine_util';\nimport {TensorInfo} from './kernel_registry';\nimport {Tensor} from './tensor';\nimport {expectArraysClose} from './test_util';\nimport {BackendValues, DataType} from './types';\n\ndescribe('Backend registration', () => {\n beforeAll(() => {\n // Silences backend registration warnings.\n spyOn(console, 'warn');\n });\n\n let registeredBackends: string[] = [];\n let registerBackend: typeof tf.registerBackend;\n\n beforeEach(() => {\n // Registering a backend changes global state (engine), so we wrap\n // registration to automatically remove registered backend at the end\n // of each test.\n registerBackend = (name, factory, priority) => {\n registeredBackends.push(name);\n return tf.registerBackend(name, factory, priority);\n };\n\n ENGINE.reset();\n });\n\n afterEach(() => {\n // Remove all registered backends at the end of each test.\n registeredBackends.forEach(name => {\n if (tf.findBackendFactory(name) != null) {\n tf.removeBackend(name);\n }\n });\n registeredBackends = [];\n });\n\n it('removeBackend disposes the backend and removes the factory', () => {\n let backend: KernelBackend;\n const factory = () => {\n const newBackend = new TestKernelBackend();\n if (backend == null) {\n backend = newBackend;\n spyOn(backend, 'dispose').and.callThrough();\n }\n return newBackend;\n };\n\n registerBackend('test-backend', factory);\n\n expect(tf.findBackend('test-backend') != null).toBe(true);\n expect(tf.findBackend('test-backend')).toBe(backend);\n expect(tf.findBackendFactory('test-backend')).toBe(factory);\n\n tf.removeBackend('test-backend');\n\n expect(tf.findBackend('test-backend') == null).toBe(true);\n expect(tf.findBackend('test-backend')).toBe(null);\n expect((backend.dispose as jasmine.Spy).calls.count()).toBe(1);\n expect(tf.findBackendFactory('test-backend')).toBe(null);\n });\n\n it('findBackend initializes the backend', () => {\n let backend: KernelBackend;\n const factory = () => {\n const newBackend = new TestKernelBackend();\n if (backend == null) {\n backend = newBackend;\n }\n return newBackend;\n };\n registerBackend('custom-cpu', factory);\n\n expect(tf.findBackend('custom-cpu') != null).toBe(true);\n expect(tf.findBackend('custom-cpu')).toBe(backend);\n expect(tf.findBackendFactory('custom-cpu')).toBe(factory);\n });\n\n it('custom backend registration', () => {\n let backend: KernelBackend;\n const priority = 103;\n registerBackend('custom-cpu', () => {\n const newBackend = new TestKernelBackend();\n if (backend == null) {\n backend = newBackend;\n }\n return newBackend;\n }, priority);\n\n expect(tf.backend() != null).toBe(true);\n expect(tf.backend()).toBe(backend);\n });\n\n it('high priority backend registration fails, falls back', () => {\n let lowPriorityBackend: KernelBackend;\n const lowPriority = 103;\n const highPriority = 104;\n registerBackend('custom-low-priority', () => {\n lowPriorityBackend = new TestKernelBackend();\n return lowPriorityBackend;\n }, lowPriority);\n registerBackend('custom-high-priority', () => {\n throw new Error(`High priority backend fails`);\n }, highPriority);\n\n expect(tf.backend() != null).toBe(true);\n expect(tf.backend()).toBe(lowPriorityBackend);\n expect(tf.getBackend()).toBe('custom-low-priority');\n });\n\n it('low priority and high priority backends, setBackend low priority', () => {\n let lowPriorityBackend: KernelBackend;\n let highPriorityBackend: KernelBackend;\n const lowPriority = 103;\n const highPriority = 104;\n registerBackend('custom-low-priority', () => {\n lowPriorityBackend = new TestKernelBackend();\n return lowPriorityBackend;\n }, lowPriority);\n registerBackend('custom-high-priority', () => {\n highPriorityBackend = new TestKernelBackend();\n return highPriorityBackend;\n }, highPriority);\n\n expect(tf.backend() != null).toBe(true);\n expect(tf.backend()).toBe(highPriorityBackend);\n expect(tf.getBackend()).toBe('custom-high-priority');\n\n tf.setBackend('custom-low-priority');\n\n expect(tf.backend() != null).toBe(true);\n expect(tf.backend()).toBe(lowPriorityBackend);\n expect(tf.getBackend()).toBe('custom-low-priority');\n });\n\n it('default custom background null', () => {\n expect(tf.findBackend('custom')).toBeNull();\n });\n\n it('allow custom backend', () => {\n const backend = new TestKernelBackend();\n const success = registerBackend('custom', () => backend);\n expect(success).toBeTruthy();\n expect(tf.findBackend('custom')).toEqual(backend);\n });\n\n it('sync backend with await ready works', async () => {\n const testBackend = new TestKernelBackend();\n registerBackend('sync', () => testBackend);\n tf.setBackend('sync');\n\n expect(tf.getBackend()).toEqual('sync');\n await tf.ready();\n expect(tf.backend()).toEqual(testBackend);\n });\n\n it('sync backend without await ready works', async () => {\n const testBackend = new TestKernelBackend();\n registerBackend('sync', () => testBackend);\n tf.setBackend('sync');\n\n expect(tf.getBackend()).toEqual('sync');\n expect(tf.backend()).toEqual(testBackend);\n });\n\n it('async backend with await ready works', async () => {\n const testBackend = new TestKernelBackend();\n registerBackend('async', async () => {\n await tf.nextFrame();\n return testBackend;\n });\n tf.setBackend('async');\n\n expect(tf.getBackend()).toEqual('async');\n await tf.ready();\n expect(tf.backend()).toEqual(testBackend);\n });\n\n it('async backend without await ready does not work', async () => {\n const testBackend = new TestKernelBackend();\n registerBackend('async', async () => {\n await tf.nextFrame();\n return testBackend;\n });\n tf.setBackend('async');\n\n expect(tf.getBackend()).toEqual('async');\n expect(() => tf.backend())\n .toThrowError(/Backend 'async' has not yet been initialized./);\n });\n\n it('tf.square() fails if user does not await ready on async backend',\n async () => {\n registerBackend('async', async () => {\n await tf.nextFrame();\n return new TestKernelBackend();\n });\n tf.setBackend('async');\n expect(() => tf.square(2))\n .toThrowError(/Backend 'async' has not yet been initialized/);\n });\n\n it('tf.square() works when user awaits ready on async backend', async () => {\n registerBackend('async', async () => {\n await tf.nextFrame();\n return new TestKernelBackend();\n });\n tf.setBackend('async');\n await tf.ready();\n expect(() => tf.square(2)).toThrowError(/'write' not yet implemented/);\n });\n\n it('Registering async2 (higher priority) fails, async1 becomes active',\n async () => {\n const testBackend = new TestKernelBackend();\n registerBackend('async1', async () => {\n await tf.nextFrame();\n return testBackend;\n }, 100 /* priority */);\n registerBackend('async2', async () => {\n await tf.nextFrame();\n throw new Error('failed to create async2');\n }, 101 /* priority */);\n\n // Await for the library to find the best backend that succesfully\n // initializes.\n await tf.ready();\n expect(tf.backend()).toEqual(testBackend);\n expect(tf.getBackend()).toBe('async1');\n });\n\n it('Registering sync as higher priority and async as lower priority',\n async () => {\n const testBackend = new TestKernelBackend();\n registerBackend('sync', () => testBackend, 101 /* priority */);\n registerBackend('async', async () => {\n await tf.nextFrame();\n return new TestKernelBackend();\n }, 100 /* priority */);\n\n // No need to await for ready() since the highest priority one is sync.\n expect(tf.backend()).toEqual(testBackend);\n expect(tf.getBackend()).toBe('sync');\n });\n\n it('async as higher priority and sync as lower priority with await ready',\n async () => {\n const testBackend = new TestKernelBackend();\n registerBackend('async', async () => {\n await tf.nextFrame();\n return testBackend;\n }, 101 /* priority */);\n registerBackend(\n 'sync', () => new TestKernelBackend(), 100 /* priority */);\n\n await tf.ready();\n expect(tf.backend()).toEqual(testBackend);\n expect(tf.getBackend()).toBe('async');\n });\n\n it('async as higher priority and sync as lower priority w/o await ready',\n async () => {\n const testBackend = new TestKernelBackend();\n registerBackend('async', async () => {\n await tf.nextFrame();\n return testBackend;\n }, 101 /* priority */);\n registerBackend(\n 'sync', () => new TestKernelBackend(), 100 /* priority */);\n\n expect(() => tf.backend())\n .toThrowError(\n /The highest priority backend 'async' has not yet been/);\n });\n\n it('Registering and setting a backend that fails to register', async () => {\n registerBackend('async', async () => {\n await tf.nextFrame();\n throw new Error('failed to create async');\n });\n const success = tf.setBackend('async');\n expect(tf.getBackend()).toBe('async');\n expect(() => tf.backend())\n .toThrowError(/Backend 'async' has not yet been initialized/);\n expect(await success).toBe(false);\n });\n});\n\ndescribeWithFlags('memory', ALL_ENVS, () => {\n it('Sum(float)', async () => {\n expect(tf.memory().numTensors).toBe(0);\n expect(tf.memory().numBytes).toBe(0);\n const sum = tf.tidy(() => {\n const a = tf.tensor1d([1, 2, 3, 4]);\n expect(tf.memory().numTensors).toBe(1);\n expect(tf.memory().numBytes).toBe(4 * 4);\n return a.sum();\n });\n expect(tf.memory().numTensors).toBe(1);\n expect(tf.memory().numBytes).toBe(4);\n expectArraysClose(await sum.data(), [1 + 2 + 3 + 4]);\n });\n\n it('Sum(bool)', async () => {\n const sum = tf.tidy(() => {\n const a = tf.tensor1d([true, true, false, true], 'bool');\n expect(tf.memory().numTensors).toBe(1);\n expect(tf.memory().numBytes).toBe(4);\n return a.sum();\n });\n expect(tf.memory().numTensors).toBe(1);\n expect(tf.memory().numBytes).toBe(4);\n expect(sum.dtype).toBe('int32');\n expectArraysClose(await sum.data(), [1 + 1 + 0 + 1]);\n });\n\n it('Sum(int32)', async () => {\n const sum = tf.tidy(() => {\n const a = tf.tensor1d([1, 1, 0, 1], 'int32');\n expect(tf.memory().numTensors).toBe(1);\n expect(tf.memory().numBytes).toBe(4 * 4);\n return a.sum();\n });\n expect(tf.memory().numTensors).toBe(1);\n expect(tf.memory().numBytes).toBe(4);\n expect(sum.dtype).toBe('int32');\n expectArraysClose(await sum.data(), [1 + 1 + 0 + 1]);\n });\n\n it('string tensor', () => {\n const a = tf.tensor([['a', 'bb'], ['c', 'd']]);\n\n expect(tf.memory().numTensors).toBe(1);\n expect(tf.memory().numBytes).toBe(5); // 5 letters, each 1 byte in utf8.\n\n a.dispose();\n\n expect(tf.memory().numTensors).toBe(0);\n expect(tf.memory().numBytes).toBe(0);\n });\n\n it('unreliable is true for string tensors', () => {\n tf.tensor('a');\n const mem = tf.memory();\n expect(mem.unreliable).toBe(true);\n const expectedReason = 'Memory usage by string tensors is approximate ' +\n '(2 bytes per character)';\n expect(mem.reasons.indexOf(expectedReason) >= 0).toBe(true);\n });\n});\n\ndescribeWithFlags('profile', ALL_ENVS, () => {\n it('squaring', async () => {\n const profile = await tf.profile(() => {\n const x = tf.tensor1d([1, 2, 3]);\n let x2 = x.square();\n x2.dispose();\n x2 = x.square();\n x2.dispose();\n return x;\n });\n\n const result = profile.result as Tensor;\n\n expect(profile.newBytes).toBe(12);\n expect(profile.peakBytes).toBe(24);\n expect(profile.newTensors).toBe(1);\n expectArraysClose(await result.data(), [1, 2, 3]);\n expect(profile.kernels.length).toBe(2);\n\n // Test the types for `kernelTimeMs` and `extraInfo` to confirm the promises\n // are resolved.\n expect(profile.kernels[0].kernelTimeMs instanceof Promise).toBe(false);\n expect(profile.kernels[0].extraInfo instanceof Promise).toBe(false);\n expect(profile.kernels[1].kernelTimeMs instanceof Promise).toBe(false);\n expect(profile.kernels[1].extraInfo instanceof Promise).toBe(false);\n\n // The specific values of `kernelTimeMs` and `extraInfo` are tested in the\n // tests of Profiler.profileKernel, so their values are not tested here.\n expect(profile.kernels[0]).toEqual({\n 'name': 'Square',\n 'bytesAdded': 12,\n 'totalBytesSnapshot': 24,\n 'tensorsAdded': 1,\n 'totalTensorsSnapshot': 2,\n 'inputShapes': [[3]],\n 'outputShapes': [[3]],\n 'kernelTimeMs': profile.kernels[0].kernelTimeMs,\n 'extraInfo': profile.kernels[0].extraInfo\n });\n\n expect(profile.kernels[1]).toEqual({\n 'name': 'Square',\n 'bytesAdded': 12,\n 'totalBytesSnapshot': 24,\n 'tensorsAdded': 1,\n 'totalTensorsSnapshot': 2,\n 'inputShapes': [[3]],\n 'outputShapes': [[3]],\n 'kernelTimeMs': profile.kernels[1].kernelTimeMs,\n 'extraInfo': profile.kernels[1].extraInfo\n });\n });\n\n it('squaring without disposing', async () => {\n const profile = await tf.profile(() => {\n const x = tf.tensor1d([1, 2, 3]);\n const x2 = x.square();\n return x2;\n });\n\n const result = profile.result as Tensor;\n\n expect(profile.newBytes).toBe(24);\n expect(profile.peakBytes).toBe(24);\n expect(profile.newTensors).toBe(2);\n expectArraysClose(await result.data(), [1, 4, 9]);\n expect(profile.kernels.length).toBe(1);\n expect(profile.kernels[0].kernelTimeMs instanceof Promise).toBe(false);\n expect(profile.kernels[0].extraInfo instanceof Promise).toBe(false);\n expect(profile.kernels[0]).toEqual({\n 'name': 'Square',\n 'bytesAdded': 12,\n 'totalBytesSnapshot': 24,\n 'tensorsAdded': 1,\n 'totalTensorsSnapshot': 2,\n 'inputShapes': [[3]],\n 'outputShapes': [[3]],\n 'kernelTimeMs': profile.kernels[0].kernelTimeMs,\n 'extraInfo': profile.kernels[0].extraInfo\n });\n });\n\n it('squaring in async query', async () => {\n const profile = await tf.profile(async () => {\n await new Promise(resolve => setTimeout(resolve, 1));\n const x = tf.tensor1d([1, 2, 3]);\n const x2 = x.square();\n x2.dispose();\n return x;\n });\n\n const result = profile.result as Tensor;\n\n expect(profile.newBytes).toBe(12);\n expect(profile.peakBytes).toBe(24);\n expect(profile.newTensors).toBe(1);\n expectArraysClose(await result.data(), [1, 2, 3]);\n expect(profile.kernels.length).toBe(1);\n expect(profile.kernels[0].kernelTimeMs instanceof Promise).toBe(false);\n expect(profile.kernels[0].extraInfo instanceof Promise).toBe(false);\n expect(profile.kernels[0]).toEqual({\n 'name': 'Square',\n 'bytesAdded': 12,\n 'totalBytesSnapshot': 24,\n 'tensorsAdded': 1,\n 'totalTensorsSnapshot': 2,\n 'inputShapes': [[3]],\n 'outputShapes': [[3]],\n 'kernelTimeMs': profile.kernels[0].kernelTimeMs,\n 'extraInfo': profile.kernels[0].extraInfo\n });\n });\n\n it('reports correct kernelNames', async () => {\n const profile = await tf.profile(() => {\n const x = tf.tensor1d([1, 2, 3]);\n const x2 = x.square();\n const x3 = x2.abs();\n return x3;\n });\n\n expect(profile.kernelNames).toEqual(jasmine.arrayWithExactContents([\n 'Square', 'Abs'\n ]));\n });\n});\n\ndescribeWithFlags('disposeVariables', ALL_ENVS, () => {\n it('reuse same name variable', () => {\n tf.tensor1d([1, 2, 3]).variable(true, 'v1');\n tf.tensor1d([1, 2, 3]).variable(true, 'v2');\n expect(() => {\n tf.tensor1d([1, 2, 3]).variable(true, 'v1');\n }).toThrowError();\n tf.disposeVariables();\n tf.tensor1d([1, 2, 3]).variable(true, 'v1');\n tf.tensor1d([1, 2, 3]).variable(true, 'v2');\n });\n});\n\n/**\n * The following test constraints to the CPU environment because it needs a\n * concrete backend to exist. This test will work for any backend, but currently\n * this is the simplest backend to test against.\n */\ndescribeWithFlags(\n 'Switching cpu backends',\n {predicate: testEnv => testEnv.backendName === 'cpu'}, () => {\n beforeEach(() => {\n tf.registerBackend('cpu1', tf.findBackendFactory('cpu'));\n tf.registerBackend('cpu2', tf.findBackendFactory('cpu'));\n });\n\n afterEach(() => {\n tf.removeBackend('cpu1');\n tf.removeBackend('cpu2');\n });\n\n it('Move data from cpu1 to cpu2 backend', async () => {\n tf.setBackend('cpu1');\n // This scalar lives in cpu1.\n const a = tf.scalar(5);\n\n tf.setBackend('cpu2');\n // This scalar lives in cpu2.\n const b = tf.scalar(3);\n\n expect(tf.memory().numDataBuffers).toBe(2);\n expect(tf.memory().numTensors).toBe(2);\n expect(tf.memory().numBytes).toBe(8);\n\n // Make sure you can read both tensors.\n expectArraysClose(await a.data(), [5]);\n expectArraysClose(await b.data(), [3]);\n\n // Switch back to cpu1.\n tf.setBackend('cpu1');\n // Again make sure you can read both tensors.\n expectArraysClose(await a.data(), [5]);\n expectArraysClose(await b.data(), [3]);\n\n tf.dispose([a, b]);\n\n expect(tf.memory().numDataBuffers).toBe(0);\n expect(tf.memory().numTensors).toBe(0);\n expect(tf.memory().numBytes).toBe(0);\n });\n\n it('can execute op with data from mixed backends', async () => {\n const kernelFunc = tf.getKernel('Add', 'cpu').kernelFunc;\n tf.registerKernel({kernelName: 'Add', backendName: 'cpu1', kernelFunc});\n tf.registerKernel({kernelName: 'Add', backendName: 'cpu2', kernelFunc});\n\n tf.setBackend('cpu1');\n // This scalar lives in cpu1.\n const a = tf.scalar(5);\n\n tf.setBackend('cpu2');\n // This scalar lives in cpu2.\n const b = tf.scalar(3);\n\n // Verify that ops can execute with mixed backend data.\n ENGINE.startScope();\n tf.setBackend('cpu1');\n expectArraysClose(await tf.add(a, b).data(), [8]);\n\n tf.setBackend('cpu2');\n expectArraysClose(await tf.add(a, b).data(), [8]);\n ENGINE.endScope();\n\n tf.dispose([a, b]);\n });\n });\n\n/**\n * The following unit test is a special integration-style test that assumes\n * things about CPU & WebGL backends being registered. This tests doesn't live\n * in the backend directory because it is testing engine rather than\n * backend-specific details but needs a real backend to exist. This test will\n * fail if the CPU backends is not registered. This is intentional, we should\n * have coverage for when these backends are enabled and ensure they work with\n * the engine.\n */\ndescribeWithFlags(\n 'Switching WebGL + CPU backends', {\n predicate: testEnv => testEnv.backendName === 'webgl' &&\n ENGINE.backendNames().indexOf('webgl') !== -1 &&\n ENGINE.backendNames().indexOf('cpu') !== -1\n },\n () => {\n beforeEach(() => {\n tf.registerBackend('webgl1', tf.findBackendFactory('webgl'));\n tf.registerBackend('webgl2', tf.findBackendFactory('webgl'));\n tf.registerBackend('cpu1', tf.findBackendFactory('cpu'));\n });\n\n afterEach(() => {\n tf.removeBackend('webgl1');\n tf.removeBackend('webgl2');\n tf.removeBackend('cpu1');\n });\n\n it('can execute op with data from mixed backends', async () => {\n tf.setBackend('webgl1');\n const a = tf.scalar(5);\n\n tf.setBackend('webgl2');\n const b = tf.scalar(3);\n\n tf.setBackend('cpu1');\n const c = tf.scalar(2);\n\n // Verify that ops can execute with mixed backend data.\n ENGINE.startScope();\n tf.setBackend('webgl1');\n expectArraysClose(await tf.addN([a, b, c]).data(), [10]);\n\n tf.setBackend('webgl2');\n expectArraysClose(await tf.addN([a, b, c]).data(), [10]);\n\n tf.setBackend('cpu1');\n expectArraysClose(await tf.addN([a, b, c]).data(), [10]);\n ENGINE.endScope();\n\n expect(tf.memory().numTensors).toBe(3);\n expect(tf.memory().numDataBuffers).toBe(3);\n\n tf.dispose([a, b, c]);\n\n expect(tf.memory().numTensors).toBe(0);\n expect(tf.memory().numDataBuffers).toBe(0);\n });\n\n it('fromPixels with mixed backends works', async () => {\n tf.setBackend('webgl1');\n const a = tf.browser.fromPixels(\n new ImageData(new Uint8ClampedArray([1, 2, 3, 4]), 1, 1));\n\n tf.setBackend('webgl2');\n const b = tf.browser.fromPixels(\n new ImageData(new Uint8ClampedArray([5, 6, 7, 8]), 1, 1));\n\n expectArraysClose(await tf.add(a, b).data(), [6, 8, 10]);\n });\n\n it('single tidy multiple backends', () => {\n const kernelFunc = tf.getKernel('Square', 'webgl').kernelFunc;\n tf.registerKernel(\n {kernelName: 'Square', backendName: 'webgl1', kernelFunc});\n tf.registerKernel(\n {kernelName: 'Square', backendName: 'webgl2', kernelFunc});\n\n expect(tf.memory().numTensors).toBe(0);\n\n tf.tidy(() => {\n tf.setBackend('webgl1');\n const a = tf.scalar(1);\n a.square(); // Uploads to GPU.\n\n tf.setBackend('webgl2');\n const b = tf.scalar(1);\n b.square(); // Uploads to GPU.\n\n expect(tf.memory().numTensors).toBe(4);\n });\n expect(tf.memory().numTensors).toBe(0);\n\n tf.unregisterKernel('Square', 'webgl1');\n tf.unregisterKernel('Square', 'webgl2');\n });\n });\n\ninterface TestStorage extends KernelBackend {\n id: number;\n}\n\ndescribeWithFlags('Detects memory leaks in kernels', ALL_ENVS, () => {\n const backendName = 'test-mem';\n const kernelName = 'MyKernel';\n const kernelNameComplex = 'Kernel-complex';\n\n it('Detects memory leak in a kernel', () => {\n let dataIdsCount = 0;\n tf.registerBackend(backendName, () => {\n return {\n id: 1,\n dispose: () => null,\n disposeData: (dataId: {}) => null,\n numDataIds: () => dataIdsCount\n } as TestStorage;\n });\n\n const kernelWithMemLeak: KernelFunc = () => {\n dataIdsCount += 2;\n return {dataId: {}, shape: [], dtype: 'float32'};\n };\n tf.registerKernel({kernelName, backendName, kernelFunc: kernelWithMemLeak});\n\n tf.setBackend(backendName);\n expect(() => tf.engine().runKernel(kernelName, {}, {}))\n .toThrowError(\n /Backend 'test-mem' has an internal memory leak \\(1 data ids\\)/);\n\n tf.removeBackend(backendName);\n tf.unregisterKernel(kernelName, backendName);\n });\n\n it('No mem leak in a kernel with multiple outputs', () => {\n let dataIdsCount = 0;\n tf.registerBackend(backendName, () => {\n return {\n id: 1,\n dispose: () => null,\n disposeData: (dataId: {}) => null,\n numDataIds: () => dataIdsCount\n } as TestStorage;\n });\n tf.setBackend(backendName);\n\n const kernelWith3Outputs: KernelFunc = () => {\n dataIdsCount += 3;\n const t: TensorInfo = {dataId: {}, shape: [], dtype: 'float32'};\n return [t, t, t];\n };\n tf.registerKernel(\n {kernelName, backendName, kernelFunc: kernelWith3Outputs});\n\n const res = tf.engine().runKernel(kernelName, {}, {});\n expect(Array.isArray(res)).toBe(true);\n expect((res as Array<{}>).length).toBe(3);\n\n const kernelWithComplexOutputs: KernelFunc = () => {\n dataIdsCount += 3;\n return {dataId: {}, shape: [], dtype: 'complex64'};\n };\n tf.registerKernel({\n kernelName: kernelNameComplex,\n backendName,\n kernelFunc: kernelWithComplexOutputs\n });\n\n const res2 = tf.engine().runKernel(kernelNameComplex, {}, {}) as TensorInfo;\n expect(res2.shape).toEqual([]);\n expect(res2.dtype).toEqual('complex64');\n\n tf.removeBackend(backendName);\n tf.unregisterKernel(kernelName, backendName);\n tf.unregisterKernel(kernelNameComplex, backendName);\n });\n});\n\n// NOTE: This describe is purposefully not a describeWithFlags so that we\n// test tensor allocation where no scopes have been created.\ndescribe('Memory allocation outside a test scope', () => {\n it('constructing a tensor works', async () => {\n const backendName = 'test-backend';\n tf.registerBackend(backendName, () => {\n let storedValues: BackendValues = null;\n return {\n id: 1,\n floatPrecision: () => 32,\n write: (values: BackendValues, shape: number[], dtype: DataType) => {\n const dataId = {};\n storedValues = values;\n return dataId;\n },\n read: async (dataId: object) => storedValues,\n dispose: () => null,\n disposeData: (dataId: {}) => null\n } as TestStorage;\n });\n tf.setBackend(backendName);\n\n const a = tf.tensor1d([1, 2, 3]);\n expectArraysClose(await a.data(), [1, 2, 3]);\n a.dispose();\n\n tf.removeBackend(backendName);\n });\n});\n"]}
\No newline at end of file