"use strict";
|
/**
|
* @license
|
* Copyright 2017 Google Inc. All Rights Reserved.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
* =============================================================================
|
*/
|
Object.defineProperty(exports, "__esModule", { value: true });
|
var engine_1 = require("./engine");
|
var tensor_util_env_1 = require("./tensor_util_env");
|
var util_1 = require("./util");
|
var TEST_EPSILON_FLOAT32 = 1e-3;
|
exports.TEST_EPSILON_FLOAT16 = 1e-1;
|
function expectArraysClose(actual, expected, epsilon) {
|
if (epsilon == null) {
|
epsilon = testEpsilon();
|
}
|
return expectArraysPredicate(actual, expected, function (a, b) { return areClose(a, b, epsilon); });
|
}
|
exports.expectArraysClose = expectArraysClose;
|
function testEpsilon() {
|
return engine_1.ENGINE.backend.floatPrecision() === 32 ? TEST_EPSILON_FLOAT32 :
|
exports.TEST_EPSILON_FLOAT16;
|
}
|
exports.testEpsilon = testEpsilon;
|
function expectArraysPredicate(actual, expected, predicate) {
|
var checkClassType = true;
|
if (util_1.isTypedArray(actual) || util_1.isTypedArray(expected)) {
|
checkClassType = false;
|
}
|
if (util_1.isTypedArray(actual) && util_1.isTypedArray(expected)) {
|
checkClassType = true;
|
}
|
if (checkClassType) {
|
var aType = actual.constructor.name;
|
var bType = expected.constructor.name;
|
if (aType !== bType) {
|
throw new Error("Arrays are of different type. Actual: " + aType + ". " +
|
("Expected: " + bType));
|
}
|
}
|
if (Array.isArray(actual) && Array.isArray(expected)) {
|
var actualShape = tensor_util_env_1.inferShape(actual);
|
var expectedShape = tensor_util_env_1.inferShape(expected);
|
if (!util_1.arraysEqual(actualShape, expectedShape)) {
|
throw new Error("Arrays have different shapes. " +
|
("Actual: [" + actualShape + "]. Expected: [" + expectedShape + "]"));
|
}
|
}
|
var actualFlat = util_1.isTypedArray(actual) ? actual : util_1.flatten(actual);
|
var expectedFlat = util_1.isTypedArray(expected) ?
|
expected :
|
util_1.flatten(expected);
|
if (actualFlat.length !== expectedFlat.length) {
|
throw new Error("Arrays have different lengths actual: " + actualFlat.length + " vs " +
|
("expected: " + expectedFlat.length + ".\n") +
|
("Actual: " + actualFlat + ".\n") +
|
("Expected: " + expectedFlat + "."));
|
}
|
for (var i = 0; i < expectedFlat.length; ++i) {
|
var a = actualFlat[i];
|
var e = expectedFlat[i];
|
if (!predicate(a, e)) {
|
throw new Error("Arrays differ: actual[" + i + "] = " + a + ", expected[" + i + "] = " + e + ".\n" +
|
("Actual: " + actualFlat + ".\n") +
|
("Expected: " + expectedFlat + "."));
|
}
|
}
|
}
|
function expectPromiseToFail(fn, done) {
|
fn().then(function () { return done.fail(); }, function () { return done(); });
|
}
|
exports.expectPromiseToFail = expectPromiseToFail;
|
function expectArraysEqual(actual, expected) {
|
var exp = typeof expected === 'string' || typeof expected === 'number' ||
|
typeof expected === 'boolean' ?
|
[expected] :
|
expected;
|
if (util_1.isString(actual) || util_1.isString(actual[0]) ||
|
util_1.isString(expected) || util_1.isString(expected[0])) {
|
// tslint:disable-next-line: triple-equals
|
return expectArraysPredicate(actual, exp, function (a, b) { return a == b; });
|
}
|
return expectArraysPredicate(actual, expected, function (a, b) { return areClose(a, b, 0); });
|
}
|
exports.expectArraysEqual = expectArraysEqual;
|
function expectNumbersClose(a, e, epsilon) {
|
if (epsilon == null) {
|
epsilon = testEpsilon();
|
}
|
if (!areClose(a, e, epsilon)) {
|
throw new Error("Numbers differ: actual === " + a + ", expected === " + e);
|
}
|
}
|
exports.expectNumbersClose = expectNumbersClose;
|
function areClose(a, e, epsilon) {
|
if (!isFinite(a) && !isFinite(e)) {
|
return true;
|
}
|
if (isNaN(a) || isNaN(e) || Math.abs(a - e) > epsilon) {
|
return false;
|
}
|
return true;
|
}
|
function expectValuesInRange(actual, low, high) {
|
for (var i = 0; i < actual.length; i++) {
|
if (actual[i] < low || actual[i] > high) {
|
throw new Error("Value out of range:" + actual[i] + " low: " + low + ", high: " + high);
|
}
|
}
|
}
|
exports.expectValuesInRange = expectValuesInRange;
|
function expectArrayBuffersEqual(actual, expected) {
|
// Safari & Jasmine don't like comparing ArrayBuffers directly. Wrapping in
|
// a Float32Array solves this issue.
|
expect(new Float32Array(actual)).toEqual(new Float32Array(expected));
|
}
|
exports.expectArrayBuffersEqual = expectArrayBuffersEqual;
|
//# sourceMappingURL=test_util.js.map
|