js-num
Version:
It provides equivalent of Numpy in JavaScript.Optimized for generics.js
254 lines (227 loc) • 6.18 kB
JavaScript
var clone = require('matrix_deep_clone');
var stats = require('./Statistics.js');
var otherFunctions = function() {
function copy(data) {
return clone.deepCloneMatrix(data);
}
function generateRandomNumbers(dim, min = 0, max) {
/**
* Both the min and max values are included.
*/
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
function innerGenerateRandomNumbers(totalElements) {
var newData = [];
for (var i = 0; i < totalElements; i++) {
newData[i] = getRandomInt(min, max);
}
return newData;
}
if (max == undefined) {
var sum = 1;
for (var i in dim) {
sum = dim[i] * sum;
}
max = sum + min;
}
var totalElements = 1;
for (var i = 0; i < dim.length; i++) {
totalElements = dim[i] * totalElements;
}
var newData = innerGenerateRandomNumbers(totalElements);
return reshape(newData, dim);
}
function get_Dimensions(data) {
/*checking for single error since it causes problem*/
if (typeof(data[0]) == 'number' && typeof(data) == 'object') {
var res = []
res[0] = 1;
res[1] = data.length;
return res;
}
function get_Dim(data, dim, i = 0) {
if (typeof(data) == "object") {
dim[i] = data.length;
get_Dim(data[0], dim, ++i);
} else if (typeof(data) == "number") {
return 1;
} else {
return undefined;
}
}
var dimen = [];
get_Dim(data, dimen);
return dimen;
}
function fillWithNumber(dim, number = 0) {
var rowsNumber = dim[dim.length - 2];
var colNumber = dim[dim.length - 1];
function create2DMatrix(rows, columns, to_fill = 0) {
var res = [];
function createArray(number, to_fill = 0) {
var temp = [];
for (var i = 0; i < number; i++) {
temp[i] = to_fill;
}
return temp;
}
for (var j = 0; j < rows; j++) {
res[j] = createArray(columns, to_fill);
}
return res;
}
if (dim.length == 2) {
return create2DMatrix(rowsNumber, colNumber, number);
} else {
// it is a higher dimension matrix
var res = [];
var subset = dim.slice(0, dim.length - 2);
for (var i = 0; i < subset.length; i++) {
var temp = [];
for (var j = 0; j < subset[subset.length - 1 - i]; j++) {
if (i == 0) {
temp[j] = create2DMatrix(rowsNumber, colNumber, number)
}
}
if (i == 0) {
res[i] = temp;
} else {
res[i] = clone.deepCloneMatrix(res[i - 1]);
}
}
if (res.length == 1) {
return res[0];
} else {
return res;
}
}
}
function flatten(data) {
function inner_flatten(data) {
if (typeof(data) == 'number') {
counter++;
newdata[counter] = data;
return;
} else {
for (var i in data) {
inner_flatten(data[i]);
}
return newdata;
}
}
var newdata = [];
var counter = -1;
inner_flatten(data);
return newdata;
}
function reshape(data, dim) {
function inner_reshape() {
var rowsNumber = dim[dim.length - 2];
var colNumber = dim[dim.length - 1];
function create2DMatrix(rows, columns, to_fill = 0) {
var res = [];
function createArray(number, to_fill = 0) {
var temp = [];
for (var i = 0; i < number; i++) {
temp[i] = to_fill_data[++counter];
}
return temp;
}
for (var j = 0; j < rows; j++) {
res[j] = createArray(columns, to_fill);
}
return res;
}
if (dim.length == 2) {
return create2DMatrix(rowsNumber, colNumber);
} else {
// it is a higher dimension matrix
var res = [];
var subset = dim.slice(0, dim.length - 2);
for (var i = 0; i < subset.length; i++) {
var temp = [];
for (var j = 0; j < subset[subset.length - 1 - i]; j++) {
if (i == 0) {
temp[j] = create2DMatrix(rowsNumber, colNumber)
}
}
if (i == 0) {
res[i] = temp;
} else {
res[i] = clone.deepCloneMatrix(res[i - 1]);
}
}
if (res.length == 1) {
return res[0];
} else {
return res;
}
}
}
function isDataValid() {
var elementsInDim = 1;
for (var v of dim) {
elementsInDim *= v;
}
var givenElements = stats.totalElements(data);
if (givenElements !== elementsInDim) {
// console.log("Wrong input please try again");
return false;
} else {
// console.log("correct input");
return true;
}
}
if (isDataValid()) {
var counter = -1;
to_fill_data = flatten(data);
return inner_reshape();
} else {
throw new Error("cannot reshape data incorrect dimension given ");
}
}
function negative(data) {
function inner_negative(to_change) {
if (typeof(to_change) == 'number') {
return -to_change;
} else {
for (i in to_change) {
to_change[i] = inner_negative(to_change[i]);
}
return to_change;
}
}
safety = clone.deepCloneMatrix(data);
return inner_negative(safety);
}
function abs(data) {
function inner_abs(to_change) {
if (typeof(to_change) == 'number') {
if (to_change < 0) {
return -to_change;
} else {
return to_change;
}
} else {
for (i in to_change) {
to_change[i] = inner_abs(to_change[i]);
}
return to_change;
}
}
safety = clone.deepCloneMatrix(data);
return inner_abs(safety);
}
return {
generateRandomNumbers: generateRandomNumbers,
get_Dimensions: get_Dimensions,
fillWithNumber: fillWithNumber,
flatten: flatten,
reshape: reshape,
negative: negative,
abs: abs,
copy: copy
}
}
module.exports = otherFunctions();