Skip to content

Commit

Permalink
Prerelease Eta v1.7.0
Browse files Browse the repository at this point in the history
Added:
- matr.exchange(size)
- matr.shift(size, shiftAmount)
- matr.binomial(size, type)
- matr.Hilbert(size)
- matr.Lehmer(size)
- matr.mulvec(matr, vec)
- matr.addKronecker(matr_1, matr_2)
- matr.mulKronecker(matr_1, matr_2)
- tens.contract(tens)

Removed:
- Nothing

Changed:
- numb.binomial(n, k)
- tens.rank(tens)
- tens.resize(tens, size)
- tens.push(tens, rank, index, elements)
- tens.pull(tens, rank, index)
  • Loading branch information
Zushah committed Dec 31, 2023
1 parent 7a23136 commit b480634
Show file tree
Hide file tree
Showing 2 changed files with 356 additions and 62 deletions.
209 changes: 178 additions & 31 deletions src/Chalkboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,23 @@ var Chalkboard = {
}
},
binomial: function(n, k) {
if(k < 0 || k > n) {
return 0;
}
if(k === 0 || k === n) {
return 1;
} else {
return Chalkboard.numb.binomial(n - 1, k - 1) + Chalkboard.numb.binomial(n - 1, k);
}
if(k === 1 || k === n - 1) {
return n;
}
if(n - k < k) {
k = n - k;
}
var result = n;
for(var i = 2; i <= k; i++) {
result *= (n - i + 1) / i;
}
return Math.round(result);
},
Fibonacci: function(num) {
var sequence = [0, 1];
Expand Down Expand Up @@ -2862,6 +2874,21 @@ var Chalkboard = {
return undefined;
}
},
exchange: function(size) {
if(Number.isInteger(size) && size > 0) {
var result = Chalkboard.matr.fill(0, size, size);
for(var i = 0; i < size; i++) {
for(var j = 0; j < size; j++) {
if(i + j === size - 1) {
result[i][j] = 1;
}
}
}
return result;
} else {
return undefined;
}
},
random: function(rows, cols, inf, sup) {
if(Number.isInteger(rows) && Number.isInteger(cols) && rows > 0 && cols > 0) {
var result = Chalkboard.matr.new();
Expand All @@ -2876,6 +2903,73 @@ var Chalkboard = {
return undefined;
}
},
shift: function(size, shiftAmount) {
shiftAmount = shiftAmount || 1;
if(Number.isInteger(size) && size > 0) {
var result = Chalkboard.matr.fill(0, size, size);
for(var i = 0; i < size; i++) {
for(var j = 0; j < size; j++) {
result[i][j] = Chalkboard.numb.Kronecker(i + shiftAmount, j);
}
}
return result;
} else {
return undefined;
}
},
binomial: function(size, type) {
type = type || "lower";
if(Number.isInteger(size) && size > 0) {
var result = Chalkboard.matr.new();
for(var i = 0; i < size; i++) {
result.push([]);
for(var j = 0; j < size; j++) {
if(type === "lower") {
result[i].push(Chalkboard.numb.binomial(i, j));
} else if(type === "upper") {
result[i].push(Chalkboard.numb.binomial(j, i));
}
}
}
if(type === "symmetric") {
return Chalkboard.matr.mul(Chalkboard.matr.binomial(size, "lower"), Chalkboard.matr.binomial(size, "upper"));
} else if(type !== "lower" && type !== "upper") {
return "TypeError: Parameter \"type\" must be either \"lower\", \"upper\", or \"symmetric\".";
} else {
return result;
}
} else {
return undefined;
}
},
Hilbert: function(size) {
if(Number.isInteger(size) && size > 0) {
var result = Chalkboard.matr.new();
for(var i = 0; i < size; i++) {
result.push([]);
for(var j = 0; j < size; j++) {
result[i].push(1 / (i + j + 1));
}
}
return result;
} else {
return undefined;
}
},
Lehmer: function(size) {
if(Number.isInteger(size) && size > 0) {
var result = Chalkboard.matr.new();
for(var i = 0; i < size; i++) {
result.push([]);
for(var j = 0; j < size; j++) {
result[i].push(Math.min(i + 1, j + 1) / Math.max(i + 1, j + 1));
}
}
return result;
} else {
return undefined;
}
},
cofactor: function(matr, row, col) {
return matr.slice(0, row - 1).concat(matr.slice(row)).map(function(row) {
return row.slice(0, col - 1).concat(row.slice(col));
Expand Down Expand Up @@ -3212,6 +3306,29 @@ var Chalkboard = {
return undefined;
}
},
mulvec: function(matr, vec) {
if(vec.type === "vec2") {
if(Chalkboard.matr.rows(matr) === 2) {
return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec)), "vec2");
} else {
return Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec));
}
} else if(vec.type === "vec3") {
if(Chalkboard.matr.rows(matr) === 3) {
return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vec3.toMatrix(vec)), "vec3");
} else {
return Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec));
}
} else if(vec.type === "vec4") {
if(Chalkboard.matr.rows(matr) === 4) {
return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vec4.toMatrix(vec)), "vec4");
} else {
return Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec));
}
} else {
return "TypeError: Parameter \"vec\" should be \"vec2\", \"vec3\", or \"vec4\".";
}
},
pow: function(matr, num) {
if(Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
if(Number.isInteger(num) && num >= 0) {
Expand All @@ -3231,6 +3348,29 @@ var Chalkboard = {
return undefined;
}
},
addKronecker: function(matr_1, matr_2) {
if(Chalkboard.matr.rows(matr_1) === Chalkboard.matr.cols(matr_1) && Chalkboard.matr.rows(matr_2) === Chalkboard.matr.cols(matr_2)) {
return Chalkboard.matr.add(Chalkboard.matr.mulKronecker(matr_1, Chalkboard.matr.identity(Chalkboard.matr.rows(matr_1))), Chalkboard.matr.mulKronecker(Chalkboard.matr.identity(Chalkboard.matr.rows(matr_2)), matr_2));
} else {
return undefined;
}
},
mulKronecker: function(matr_1, matr_2) {
var result = Chalkboard.matr.new();
for(var i = 0; i < Chalkboard.matr.rows(matr_1); i++) {
for(var j = 0; j < Chalkboard.matr.cols(matr_1); j++) {
for(var k = 0; k < Chalkboard.matr.rows(matr_2); k++) {
for(var l = 0; l < Chalkboard.matr.cols(matr_2); l++) {
if(!result[i * Chalkboard.matr.rows(matr_2) + k]) {
result[i * Chalkboard.matr.rows(matr_2) + k] = [];
}
result[i * Chalkboard.matr.rows(matr_2) + k][j * Chalkboard.matr.cols(matr_2) + l] = matr_1[i][j] * matr_2[k][l];
}
}
}
}
return result;
},
reduce: function(matr) {
var lead = 0;
for(var row = 0; row < Chalkboard.matr.rows(matr); row++) {
Expand Down Expand Up @@ -3329,24 +3469,24 @@ var Chalkboard = {
}
return result;
},
toString: function(matr) {
var result = "";
toObject: function(matr) {
var result = {};
for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
result += "[ ";
result["i" + (i + 1)] = {};
for(var j = 0; j < Chalkboard.matr.cols(matr); j++) {
result += matr[i][j].toString() + " ";
result["i" + (i + 1)]["j" + (j + 1)] = matr[i][j];
}
result = result.trimEnd() + " ]\n";
}
return result;
},
toObject: function(matr) {
var result = {};
toString: function(matr) {
var result = "";
for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
result["i" + (i + 1)] = {};
result += "[ ";
for(var j = 0; j < Chalkboard.matr.cols(matr); j++) {
result["i" + (i + 1)]["j" + (j + 1)] = matr[i][j];
result += matr[i][j].toString() + " ";
}
result = result.trimEnd() + " ]\n";
}
return result;
},
Expand Down Expand Up @@ -3374,11 +3514,11 @@ var Chalkboard = {
};
return newNDArray(tensor);
},
layers: function(tens) {
rank: function(tens) {
if(tens.constructor === Array) {
var result = 0;
for(var i = 0; i < tens.length; i++) {
result = Math.max(result, Chalkboard.tens.layers(tens[i]));
result = Math.max(result, Chalkboard.tens.rank(tens[i]));
}
return result + 1;
} else {
Expand Down Expand Up @@ -3406,31 +3546,31 @@ var Chalkboard = {
if(arr2[i].constructor === Array) {
refill(arr1, arr2[i]);
} else {
arr2[i] = arr1.shift();
arr2[i] = arr1.length > 0 ? arr1.shift() : 0;
}
}
};
refill(Chalkboard.tens.toArray(tens), result);
return result;
},
push: function(tens, layer, index, elements) {
if(layer === 0) {
push: function(tens, rank, index, elements) {
if(rank === 0) {
tens.splice(index, 0, elements);
return tens;
} else {
for(var i = 0; i < tens.length; i++) {
Chalkboard.tens.push(tens[i], layer - 1, index, elements[i]);
Chalkboard.tens.push(tens[i], rank - 1, index, elements[i]);
}
return tens;
}
},
pull: function(tens, layer, index) {
if(layer === 0) {
pull: function(tens, rank, index) {
if(rank === 0) {
tens.splice(index, 1);
return tens;
} else {
for(var i = 0; i < tens.length; i++) {
Chalkboard.tens.pull(tens[i], layer - 1, index);
Chalkboard.tens.pull(tens[i], rank - 1, index);
}
return tens;
}
Expand Down Expand Up @@ -3489,6 +3629,13 @@ var Chalkboard = {
}
return newNDArray(size);
},
contract: function(tens) {
if(Chalkboard.tens.rank(tens) > 2) {
return Chalkboard.tens.resize(tens, Chalkboard.tens.size(tens)[0], Chalkboard.tens.size(tens).slice(1).reduce(function(a, b) { return a * b; }) / Chalkboard.tens.size(tens)[0]);
} else if(Chalkboard.tens.rank(tens) === 2) {
return Chalkboard.matr.trace(tens);
}
},
transpose: function(tens) {
return Chalkboard.tens.resize(tens, Chalkboard.tens.size(tens).reverse());
},
Expand Down Expand Up @@ -3652,6 +3799,17 @@ var Chalkboard = {
flatten(tens);
return result;
},
toObject: function(tens) {
if(tens.constructor === Array) {
var result = {};
for(var i = 0; i < tens.length; i++) {
result["_" + (i + 1)] = Chalkboard.tens.toObject(tens[i]);
}
return result;
} else {
return tens;
}
},
toString: function(tens, indentation) {
if(indentation === undefined) { indentation = 0; }
if(tens[0].constructor === Array) {
Expand All @@ -3670,17 +3828,6 @@ var Chalkboard = {
return result;
}
},
toObject: function(tens) {
if(tens.constructor === Array) {
var result = {};
for(var i = 0; i < tens.length; i++) {
result["_" + (i + 1)] = Chalkboard.tens.toObject(tens[i]);
}
return result;
} else {
return tens;
}
},
print: function(tens) {
return console.log(Chalkboard.tens.toString(tens));
}
Expand Down

0 comments on commit b480634

Please sign in to comment.