gx
chenyc
2025-06-12 7b72ac13a83764a662159d4a49b7fffb90476ecb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
 * @license
 * Copyright 2018 Google LLC. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * =============================================================================
 */
import * as tf from './index';
import { ALL_ENVS, describeWithFlags } from './jasmine_util';
import { expectArraysClose, expectArraysEqual } from './test_util';
describeWithFlags('tf.buffer', ALL_ENVS, () => {
    it('float32', async () => {
        const buff = tf.buffer([1, 2, 3], 'float32');
        buff.set(1.3, 0, 0, 0);
        buff.set(2.9, 0, 1, 0);
        expect(buff.get(0, 0, 0)).toBeCloseTo(1.3);
        expect(buff.get(0, 0, 1)).toBeCloseTo(0);
        expect(buff.get(0, 0, 2)).toBeCloseTo(0);
        expect(buff.get(0, 1, 0)).toBeCloseTo(2.9);
        expect(buff.get(0, 1, 1)).toBeCloseTo(0);
        expect(buff.get(0, 1, 2)).toBeCloseTo(0);
        expectArraysClose(await buff.toTensor().data(), [1.3, 0, 0, 2.9, 0, 0]);
        expectArraysClose(buff.values, new Float32Array([1.3, 0, 0, 2.9, 0, 0]));
    });
    it('get() out of range throws', async () => {
        const t = tf.tensor([1, 2, 3, 4, 5, 6, 7, 8], [2, 2, 2]);
        const buff = await t.buffer();
        expect(buff.get(0, 0, 0)).toBeCloseTo(1);
        expect(buff.get(0, 0, 1)).toBeCloseTo(2);
        expect(() => buff.get(0, 0, 2))
            .toThrowError(/Requested out of range element/);
    });
    it('int32', async () => {
        const buff = tf.buffer([2, 3], 'int32');
        buff.set(1.3, 0, 0);
        buff.set(2.1, 1, 1);
        expect(buff.get(0, 0)).toEqual(1);
        expect(buff.get(0, 1)).toEqual(0);
        expect(buff.get(0, 2)).toEqual(0);
        expect(buff.get(1, 0)).toEqual(0);
        expect(buff.get(1, 1)).toEqual(2);
        expect(buff.get(1, 2)).toEqual(0);
        expectArraysClose(await buff.toTensor().data(), [1, 0, 0, 0, 2, 0]);
        expectArraysClose(buff.values, new Int32Array([1, 0, 0, 0, 2, 0]));
    });
    it('bool', async () => {
        const buff = tf.buffer([4], 'bool');
        buff.set(true, 1);
        buff.set(true, 2);
        expect(buff.get(0)).toBeFalsy();
        expect(buff.get(1)).toBeTruthy();
        expect(buff.get(2)).toBeTruthy();
        expect(buff.get(3)).toBeFalsy();
        expectArraysClose(await buff.toTensor().data(), [0, 1, 1, 0]);
        expectArraysClose(buff.values, new Uint8Array([0, 1, 1, 0]));
    });
    it('string', async () => {
        const buff = tf.buffer([2, 2], 'string');
        buff.set('first', 0, 0);
        buff.set('third', 1, 0);
        expect(buff.get(0, 0)).toEqual('first');
        expect(buff.get(0, 1)).toBeFalsy();
        expect(buff.get(1, 0)).toEqual('third');
        expect(buff.get(1, 1)).toBeFalsy();
        expectArraysEqual(await buff.toTensor().data(), ['first', null, 'third', null]);
    });
    it('throws when passed non-integer shape', () => {
        const msg = 'Tensor must have a shape comprised of positive ' +
            'integers but got shape [2,2.2].';
        expect(() => tf.buffer([2, 2.2])).toThrowError(msg);
    });
    it('throws when passed negative shape', () => {
        const msg = 'Tensor must have a shape comprised of positive ' +
            'integers but got shape [2,-2].';
        expect(() => tf.buffer([2, -2])).toThrowError(msg);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyX3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2J1ZmZlcl90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFakUsaUJBQWlCLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7SUFDNUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFD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LENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQyxpQkFBaUIsQ0FDYixNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLE1BQU0sR0FBRyxHQUFHLGlEQUFpRDtZQUN6RCxpQ0FBaUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLEdBQUcsR0FBRyxpREFBaUQ7WUFDekQsZ0NBQWdDLENBQUM7UUFDckMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHRmIGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHtBTExfRU5WUywgZGVzY3JpYmVXaXRoRmxhZ3N9IGZyb20gJy4vamFzbWluZV91dGlsJztcbmltcG9ydCB7ZXhwZWN0QXJyYXlzQ2xvc2UsIGV4cGVjdEFycmF5c0VxdWFsfSBmcm9tICcuL3Rlc3RfdXRpbCc7XG5cbmRlc2NyaWJlV2l0aEZsYWdzKCd0Zi5idWZmZXInLCBBTExfRU5WUywgKCkgPT4ge1xuICBpdCgnZmxvYXQzMicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWZmID0gdGYuYnVmZmVyKFsxLCAyLCAzXSwgJ2Zsb2F0MzInKTtcbiAgICBidWZmLnNldCgxLjMsIDAsIDAsIDApO1xuICAgIGJ1ZmYuc2V0KDIuOSwgMCwgMSwgMCk7XG4gICAgZXhwZWN0KGJ1ZmYuZ2V0KDAsIDAsIDApKS50b0JlQ2xvc2VUbygxLjMpO1xuICAgIGV4cGVjdChidWZmLmdldCgwLCAwLCAxKSkudG9CZUNsb3NlVG8oMCk7XG4gICAgZXhwZWN0KGJ1ZmYuZ2V0KDAsIDAsIDIpKS50b0JlQ2xvc2VUbygwKTtcbiAgICBleHBlY3QoYnVmZi5nZXQoMCwgMSwgMCkpLnRvQmVDbG9zZVRvKDIuOSk7XG4gICAgZXhwZWN0KGJ1ZmYuZ2V0KDAsIDEsIDEpKS50b0JlQ2xvc2VUbygwKTtcbiAgICBleHBlY3QoYnVmZi5nZXQoMCwgMSwgMikpLnRvQmVDbG9zZVRvKDApO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGF3YWl0IGJ1ZmYudG9UZW5zb3IoKS5kYXRhKCksIFsxLjMsIDAsIDAsIDIuOSwgMCwgMF0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGJ1ZmYudmFsdWVzLCBuZXcgRmxvYXQzMkFycmF5KFsxLjMsIDAsIDAsIDIuOSwgMCwgMF0pKTtcbiAgfSk7XG5cbiAgaXQoJ2dldCgpIG91dCBvZiByYW5nZSB0aHJvd3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdCA9IHRmLnRlbnNvcihbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0sIFsyLCAyLCAyXSk7XG5cbiAgICBjb25zdCBidWZmID0gYXdhaXQgdC5idWZmZXIoKTtcbiAgICBleHBlY3QoYnVmZi5nZXQoMCwgMCwgMCkpLnRvQmVDbG9zZVRvKDEpO1xuICAgIGV4cGVjdChidWZmLmdldCgwLCAwLCAxKSkudG9CZUNsb3NlVG8oMik7XG4gICAgZXhwZWN0KCgpID0+IGJ1ZmYuZ2V0KDAsIDAsIDIpKVxuICAgICAgICAudG9UaHJvd0Vycm9yKC9SZXF1ZXN0ZWQgb3V0IG9mIHJhbmdlIGVsZW1lbnQvKTtcbiAgfSk7XG5cbiAgaXQoJ2ludDMyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1ZmYgPSB0Zi5idWZmZXIoWzIsIDNdLCAnaW50MzInKTtcbiAgICBidWZmLnNldCgxLjMsIDAsIDApO1xuICAgIGJ1ZmYuc2V0KDIuMSwgMSwgMSk7XG4gICAgZXhwZWN0KGJ1ZmYuZ2V0KDAsIDApKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChidWZmLmdldCgwLCAxKSkudG9FcXVhbCgwKTtcbiAgICBleHBlY3QoYnVmZi5nZXQoMCwgMikpLnRvRXF1YWwoMCk7XG4gICAgZXhwZWN0KGJ1ZmYuZ2V0KDEsIDApKS50b0VxdWFsKDApO1xuICAgIGV4cGVjdChidWZmLmdldCgxLCAxKSkudG9FcXVhbCgyKTtcbiAgICBleHBlY3QoYnVmZi5nZXQoMSwgMikpLnRvRXF1YWwoMCk7XG4gICAgZXhwZWN0QXJyYXlzQ2xvc2UoYXdhaXQgYnVmZi50b1RlbnNvcigpLmRhdGEoKSwgWzEsIDAsIDAsIDAsIDIsIDBdKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShidWZmLnZhbHVlcywgbmV3IEludDMyQXJyYXkoWzEsIDAsIDAsIDAsIDIsIDBdKSk7XG4gIH0pO1xuXG4gIGl0KCdib29sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1ZmYgPSB0Zi5idWZmZXIoWzRdLCAnYm9vbCcpO1xuICAgIGJ1ZmYuc2V0KHRydWUsIDEpO1xuICAgIGJ1ZmYuc2V0KHRydWUsIDIpO1xuICAgIGV4cGVjdChidWZmLmdldCgwKSkudG9CZUZhbHN5KCk7XG4gICAgZXhwZWN0KGJ1ZmYuZ2V0KDEpKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KGJ1ZmYuZ2V0KDIpKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KGJ1ZmYuZ2V0KDMpKS50b0JlRmFsc3koKTtcbiAgICBleHBlY3RBcnJheXNDbG9zZShhd2FpdCBidWZmLnRvVGVuc29yKCkuZGF0YSgpLCBbMCwgMSwgMSwgMF0pO1xuICAgIGV4cGVjdEFycmF5c0Nsb3NlKGJ1ZmYudmFsdWVzLCBuZXcgVWludDhBcnJheShbMCwgMSwgMSwgMF0pKTtcbiAgfSk7XG5cbiAgaXQoJ3N0cmluZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWZmID0gdGYuYnVmZmVyKFsyLCAyXSwgJ3N0cmluZycpO1xuICAgIGJ1ZmYuc2V0KCdmaXJzdCcsIDAsIDApO1xuICAgIGJ1ZmYuc2V0KCd0aGlyZCcsIDEsIDApO1xuICAgIGV4cGVjdChidWZmLmdldCgwLCAwKSkudG9FcXVhbCgnZmlyc3QnKTtcbiAgICBleHBlY3QoYnVmZi5nZXQoMCwgMSkpLnRvQmVGYWxzeSgpO1xuICAgIGV4cGVjdChidWZmLmdldCgxLCAwKSkudG9FcXVhbCgndGhpcmQnKTtcbiAgICBleHBlY3QoYnVmZi5nZXQoMSwgMSkpLnRvQmVGYWxzeSgpO1xuICAgIGV4cGVjdEFycmF5c0VxdWFsKFxuICAgICAgICBhd2FpdCBidWZmLnRvVGVuc29yKCkuZGF0YSgpLCBbJ2ZpcnN0JywgbnVsbCwgJ3RoaXJkJywgbnVsbF0pO1xuICB9KTtcblxuICBpdCgndGhyb3dzIHdoZW4gcGFzc2VkIG5vbi1pbnRlZ2VyIHNoYXBlJywgKCkgPT4ge1xuICAgIGNvbnN0IG1zZyA9ICdUZW5zb3IgbXVzdCBoYXZlIGEgc2hhcGUgY29tcHJpc2VkIG9mIHBvc2l0aXZlICcgK1xuICAgICAgICAnaW50ZWdlcnMgYnV0IGdvdCBzaGFwZSBbMiwyLjJdLic7XG4gICAgZXhwZWN0KCgpID0+IHRmLmJ1ZmZlcihbMiwgMi4yXSkpLnRvVGhyb3dFcnJvcihtc2cpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIHdoZW4gcGFzc2VkIG5lZ2F0aXZlIHNoYXBlJywgKCkgPT4ge1xuICAgIGNvbnN0IG1zZyA9ICdUZW5zb3IgbXVzdCBoYXZlIGEgc2hhcGUgY29tcHJpc2VkIG9mIHBvc2l0aXZlICcgK1xuICAgICAgICAnaW50ZWdlcnMgYnV0IGdvdCBzaGFwZSBbMiwtMl0uJztcbiAgICBleHBlY3QoKCkgPT4gdGYuYnVmZmVyKFsyLCAtMl0pKS50b1Rocm93RXJyb3IobXNnKTtcbiAgfSk7XG59KTtcbiJdfQ==