@tensorflow/tfjs-core
Version:
Hardware-accelerated JavaScript library for machine intelligence
104 lines • 3.94 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var util = require("./util");
var FORMAT_LIMIT_NUM_VALS = 20;
var FORMAT_NUM_FIRST_LAST_VALS = 3;
var FORMAT_NUM_SIG_DIGITS = 7;
function tensorToString(t, verbose) {
var vals = t.dataSync();
var padPerCol = computeMaxSizePerColumn(t);
var valsLines = subTensorToString(vals, t.shape, t.strides, padPerCol);
var lines = ['Tensor'];
if (verbose) {
lines.push(" dtype: " + t.dtype);
lines.push(" rank: " + t.rank);
lines.push(" shape: [" + t.shape + "]");
lines.push(" values:");
}
lines.push(valsLines.map(function (l) { return ' ' + l; }).join('\n'));
return lines.join('\n');
}
exports.tensorToString = tensorToString;
function computeMaxSizePerColumn(t) {
var vals = t.dataSync();
var n = t.size;
var numCols = t.strides[t.strides.length - 1];
var padPerCol = new Array(numCols).fill(0);
if (t.rank > 1) {
for (var row = 0; row < n / numCols; row++) {
var offset = row * numCols;
for (var j = 0; j < numCols; j++) {
padPerCol[j] =
Math.max(padPerCol[j], valToString(vals[offset + j], 0).length);
}
}
}
return padPerCol;
}
function valToString(val, pad) {
return util.rightPad(parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(), pad);
}
function subTensorToString(vals, shape, strides, padPerCol, isLast) {
if (isLast === void 0) { isLast = true; }
var size = shape[0];
var rank = shape.length;
if (rank === 0) {
return [vals[0].toString()];
}
if (rank === 1) {
if (size > FORMAT_LIMIT_NUM_VALS) {
var firstVals = Array.from(vals.subarray(0, FORMAT_NUM_FIRST_LAST_VALS));
var lastVals = Array.from(vals.subarray(size - FORMAT_NUM_FIRST_LAST_VALS, size));
return [
'[' + firstVals.map(function (x, i) { return valToString(x, padPerCol[i]); }).join(', ') +
', ..., ' +
lastVals
.map(function (x, i) { return valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i]); })
.join(', ') +
']'
];
}
return [
'[' +
Array.from(vals).map(function (x, i) { return valToString(x, padPerCol[i]); }).join(', ') +
']'
];
}
var subshape = shape.slice(1);
var substrides = strides.slice(1);
var stride = strides[0];
var lines = [];
if (size > FORMAT_LIMIT_NUM_VALS) {
for (var i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) {
var start = i * stride;
var end = start + stride;
lines.push.apply(lines, subTensorToString(vals.subarray(start, end), subshape, substrides, padPerCol, false));
}
lines.push('...');
for (var i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) {
var start = i * stride;
var end = start + stride;
lines.push.apply(lines, subTensorToString(vals.subarray(start, end), subshape, substrides, padPerCol, i === size - 1));
}
}
else {
for (var i = 0; i < size; i++) {
var start = i * stride;
var end = start + stride;
lines.push.apply(lines, subTensorToString(vals.subarray(start, end), subshape, substrides, padPerCol, i === size - 1));
}
}
var sep = rank === 2 ? ',' : '';
lines[0] = '[' + lines[0] + sep;
for (var i = 1; i < lines.length - 1; i++) {
lines[i] = ' ' + lines[i] + sep;
}
var newLineSep = ',\n';
for (var i = 2; i < rank; i++) {
newLineSep += '\n';
}
lines[lines.length - 1] =
' ' + lines[lines.length - 1] + ']' + (isLast ? '' : newLineSep);
return lines;
}
//# sourceMappingURL=tensor_util.js.map