node-red-contrib-prib-functions
Version:
Node-RED added node functions.
492 lines (487 loc) • 15.2 kB
JavaScript
const assert=require('assert');
const m2x2=[[11,12],[21,22]]
const m2x3=[[11,12,13],[21,22,23]]
describe('generatedVectorFunction', function(){
const generateVectorFunction=require("../dataAnalysis/generateVectorFunction.js");
it("error gen", function(done){
assert.throws(()=>generateVectorFunction({
code:"=a deliberate error in test",
args:["arg1,arg2"]
}),Error("code failed"))
done();
});
it("for each", function(done){
const forEach=generateVectorFunction({
code:"vector[index]+=(index+1)*10",
args:["arg1,arg2"]
})
const vector=[1,2,3,4]
forEach(vector)
assert.deepEqual(vector,[11,22,33,44])
done();
});
it("for each range", function(done){
const forEach=generateVectorFunction({code:"vector[index]+=(index+1)*10"})
const vector=[1,2,3,4]
forEach(vector,1,2)
assert.deepEqual(vector,[1,22,33,4])
done();
});
it("sumVector", function(done){
const sumVector=generateVectorFunction({code:"returnValue+=vector[index]",args:[],returnValue:0})
const vector=[1,2,3,4]
assert.deepEqual(sumVector(vector),1+2+3+4)
done();
});
it("sumVector range", function(done){
const sumVector=generateVectorFunction({code:"returnValue+=vector[index]",returnValue:10})
const vector=[1,2,3,4]
assert.deepEqual(sumVector(vector,1,2,20),20+2+3)
done();
});
it("mapVector range", function(done){
const mapVector=generateVectorFunction({
code:"returnValue[index-startOffset]=vector[index]",
args:["dataType=Array"],
returnValue:"new dataType(1+endOffset-startOffset)"
})
const vector=[1,2,3,4]
assert.deepEqual(mapVector(vector,Array,1,2),[2,3])
done();
});
it("mapVector range Float32Array", function(done){
const mapVector=generateVectorFunction({
code:"returnValue[index-startOffset]=vector[index]",
args:["dataType=Array"],returnValue:"new dataType(1+endOffset-startOffset)"
})
const vector=[1,2,3,4]
assert.deepEqual(mapVector(vector,Float32Array,1,2),new Float32Array([2,3]))
done();
});
});
describe('generateMatrixFunction', function(){
const generateMatrixFunction=require("../dataAnalysis/generateMatrixFunction.js")
const breakLogic="\nconsole.log({loop:loop});if(--loop<0) throw Error('break loop');\n"
const debugScript="console.log({rowOffset:rowOffset,rowEndOffset:rowEndOffset});"+
"console.log({columnOffset:columnOffset,columnEndOffset:columnEndOffset});"+
"console.log({elementOffset:elementOffset,matrixEndOffset:matrixEndOffset,element:element});"
it("error gen", function(done){
assert.throws(()=>generateMatrixFunction({
code:"=a deliberate error in test ",
args:["arg1,arg2"]
}),Error("code failed"))
done();
});
it("for each", function(done){
const forEach=generateMatrixFunction({
code:"row[columnOffset]=rowOffset*10+columnOffset"+breakLogic,
args:["loop=111"],
debug:true
})
const vector=[[1,2],[3,4]]
forEach(vector)
assert.deepEqual(vector,[[0,1],[10,11]])
done();
});
it("for each setElement", function(done){
const forEach=generateMatrixFunction({
code:"setElement(rowOffset*10+columnOffset)"
})
const vector=[[1,2],[3,4]]
forEach(vector)
assert.deepEqual(vector,[[0,1],[10,11]])
done();
});
it("for each vector", function(done){
const forEach=generateMatrixFunction({
code:"matrix[elementOffset]=rowOffset*10+columnOffset"+breakLogic,
args:["loop=111"],
debug:true
})
const vector=new Float32Array([1,2,3,4,5,6])
try{
forEach(vector,3,2)
} catch(ex){
console.error("error: "+ex.message)
console.error(ex.stack)
console.error(forEach.toString())
done("failed")
}
assert.deepEqual(vector,new Float32Array([0,1,10,11,20,21]))
done();
});
it("for each vector range row 1:1", function(done){
const forEach=generateMatrixFunction({
code:"matrix[elementOffset]=rowOffset*10+columnOffset"+breakLogic,
args:["loop=111"],
debug:true
})
const vector=new Float32Array([1,2,3,4,5,6])
forEach(vector,3,2,111,1,1)
assert.deepEqual(vector,new Float32Array([1,2,10,11,5,6]))
done();
});
it("for each vector range row 1:1 assign", function(done){
const forEach=generateMatrixFunction({
code:"matrix[elementOffset]=rowOffset*10+columnOffset"+breakLogic,
args:["loop=111"],
debug:true});
const vector=new Float32Array([1,2,3,4,5,6])
forEach(vector,3,2,111,1,1)
assert.deepEqual(vector,new Float32Array([1,2,10,11,5,6]))
done();
});
it("for each vector", function(done){
const forEach=generateMatrixFunction({
code:"console.log(matrix);setElement(rowOffset*10+columnOffset);console.log(matrix)"
})
const vector=new Float32Array([1,2,3,4,5,6])
forEach(vector,3,2)
assert.deepEqual(vector,new Float32Array([0,1,10,11,20,21]))
done();
});
});
describe('sum', function(){
require("../dataAnalysis/arraySum.js");
it("array 1 to 4", function(done){
assert.deepEqual([1,2,3,4].sum(),1+2+3+4)
done();
});
it("array 2 to 4", function(done){
assert.deepEqual([1,2,3,4].sum(1),2+3+4)
done();
});
it("array 2 to 3", function(done){
assert.deepEqual([1,2,3,4].sum(1,2),2+3)
done();
});
});
describe('average', function(){
require("../dataAnalysis/arrayAverage.js");
it("array 1 to 4", function(done){
assert.deepEqual([1,2,3,4].average(),(1+2+3+4)/4)
done();
});
});
describe('sumSquared', function(){
require("../dataAnalysis/arraySumSquared.js");
it("array 1 to 4", function(done){
assert.deepEqual([1,2,3,4].sumSquared(),1**2+2**2+3**2+4**2)
done();
});
it("array 2 to 4", function(done){
assert.deepEqual([1,2,3,4].sumSquared(1),2**2+3**2+4**2)
done();
});
it("array 2 to 3", function(done){
assert.deepEqual([1,2,3,4].sumSquared(1,2),2**2+3**2)
done();
});
});
describe('product', function(){
require("../dataAnalysis/arrayProduct.js");
it("array 1 to 4", function(done){
assert.deepEqual([1,2,3,4].product(),1*2*3*4)
done();
});
it("array 2 to 4", function(done){
assert.deepEqual([1,2,3,4].product(1),2*3*4)
done();
});
it("array 2 to 3", function(done){
assert.deepEqual([1,2,3,4].product(1,2),2*3)
done();
});
});
describe('arrayDifference', function(){
require("../dataAnalysis/arrayDifference.js");
it("empty", function(done){
const result=[].difference();
console.log(result)
assert.deepEqual(result,[])
done();
});
it("1 value", function(done){
const result=[1].difference();
console.log(result)
assert.deepEqual(result,[])
done();
});
it("zero", function(done){
const result=[1,1,1,1,1].difference();
console.log(result)
assert.deepEqual(result,[0,0,0,0])
done();
});
it("equal 1", function(done){
const result=[0,1,2,3,4].difference();
console.log(result)
assert.deepEqual(result,[1,1,1,1])
done();
});
it("variance", function(done){
const result=[0,0,1,3,6].difference();
console.log(result)
assert.deepEqual(result,[0,1,2,3])
done();
});
});
describe('arrayDifferenceSecondOrder', function(){
require("../dataAnalysis/arrayDifferenceSecondOrder.js");
it("empty", function(done){
const result=[].differenceSecondOrder();
console.log(result)
assert.deepEqual(result,[])
done();
});
it("1 value", function(done){
const result=[1].differenceSecondOrder();
console.log(result)
assert.deepEqual(result,[])
done();
});
it("2 values", function(done){
const result=[1,2].differenceSecondOrder();
console.log(result)
assert.deepEqual(result,[])
done();
});
it("zero", function(done){
const result=[1,1,1].differenceSecondOrder();
console.log(result)
assert.deepEqual(result,[1-1-1+1]) //[0]
done();
});
it("zero x 2", function(done){
const result=[1,1,1,1].differenceSecondOrder();
console.log(result)
assert.deepEqual(result,[0,0])
done();
});
it("one", function(done){
const result=[0,1,2].differenceSecondOrder();
console.log(result)
assert.deepEqual(result,[(0-1)-(1-2)])
done();
});
it("one x 2", function(done){
const result=[0,1,2,3].differenceSecondOrder();
console.log(result)
assert.deepEqual(result,[(0-1)-(1-2),(1-2)-(2-3)])
done();
});
it("variance", function(done){
const result=[1,2,3,5,9].differenceSecondOrder();
console.log(result)
assert.deepEqual(result,[(1-2)-(2-3),(2-3)-(3-5),(3-5)-(5-9)])
done();
});
it("differenceSecondOrder=difference(1)", function(done){
const result1=[1,2,3,5,9].differenceSecondOrder();
const result2=[1,2,3,5,9].difference(1);
console.log(result1,result2)
assert.deepEqual(result1,result2)
done();
});
});
describe('arrayDifferenceSeasonal', function(){
require("../dataAnalysis/arrayDifferenceSeasonal.js");
it("value=[]", function(done){
const result=[].differenceSeasonal();
assert.deepEqual(result,[])
const result1=[].differenceSeasonal(2);
assert.deepEqual(result1,[])
const result11=[].differenceSeasonal(1,1);
assert.deepEqual(result11,[])
done();
});
it("value=[1]", function(done){
const v=[1]
const result=v.differenceSeasonal();
assert.deepEqual(result,[])
const result1=v.differenceSeasonal(2);
assert.deepEqual(result1,[])
const result11=v.differenceSeasonal(1,1);
assert.deepEqual(result11,[])
done();
});
it("value=[1,2]", function(done){
const v=[1,2]
const result=v.differenceSeasonal();
assert.deepEqual(result,[1])
const result1=v.differenceSeasonal(2);
assert.deepEqual(result1,[])
const result11=v.differenceSeasonal(1,1);
assert.deepEqual(result11,[])
done();
});
it("value=[1,2,3,1,2,3] lag 3", function(done){
const v=[1,2,3,1,2,3]
const result=v.differenceSeasonal(3);
assert.deepEqual(result,[0,0,0])
done();
});
it("value=[1,2,3,2,3,4] lag 3", function(done){
const v=[1,2,3,2,3,4]
const result=v.differenceSeasonal(3);
assert.deepEqual(result,[1,1,1])
done();
});
});
describe('arrayForEachRange', function(){
require("../dataAnalysis/arrayForEachRange.js");
it("array 2 to 3", function(done){
const result=[];
[0,1,2,3,4].forEachRange(2,3,(v,i,a)=>result.push(v));
assert.deepEqual(result,[2,3])
done();
});
it("array 3 to 2", function(done){
const result=[];
[0,1,2,3,4].forEachRange(3,2,(v,i,a)=>result.push(v));
assert.deepEqual(result,[3,2])
done();
});
it("array ", function(done){
const result=[];
[0,1,2,3,4].forEachRange(2,3,(v,i,a)=>result.push(v));
assert.deepEqual(result,[2,3])
done();
});
});
describe('arrayReduceRange', function(){
require("../dataAnalysis/arrayReduceRange.js");
it("array 3", function(done){
const result=[0,1,2,3,4].reduceRange(3,3,(a,value,i,vector)=>a+value);
assert.deepEqual(result,3)
done();
});
it("array ", function(done){
const result=[0,1,2,3,4].reduceRange(2,3,(a,value,i,vector)=>a+value);
assert.deepEqual(result,2+3)
done();
});
});
describe('arrayRandom', function(){
require("../dataAnalysis/arrayRandom.js");
it("array 3", function(done){
const result=[0,1,2,3,4].random();
console.log(result)
assert.notDeepEqual(result,[0,1,2,3,4])
done();
});
});
describe('arraySwap', function(){
require("../dataAnalysis/arraySwap.js");
it("array 2 to 3", function(done){
const result=[];
[0,1,2,3,4].swap(2,3);
assert.deepEqual([0,1,2,3,4].swap(2,3),[0,1,3,2,4])
done();
});
});
describe('arrayScale', function(){
require("../dataAnalysis/arrayScale.js");
it("array all", function(done){
const result=[];
[0,1,2,3,4].scale(2);
assert.deepEqual([0,1,2,3,4].scale(2),[0,1*2,2*2,3*2,4*2])
done();
});
it("array 1,2", function(done){
const result=[];
[0,1,2,3,4].scale(2);
assert.deepEqual([0,1,2,3,4].scale(2,1,2),[0,1*2,2*2,3,4])
done();
});
});
describe('arrayCompareToPrecision', function(){
require("../dataAnalysis/arrayCompareToPrecision.js");
const arrayl=[0.12];
const array1=[0.12,1.123];
const array2=[0.12,1.124];
it("length mismatch", function(done){
assert.throws(()=>arrayl.compareToPrecision(array1,2))
done();
});
it("vector precision 2", function(done){
assert.doesNotThrow(()=>array1.compareToPrecision(array2,2))
done();
});
it("vector precision 3", function(done){
assert.throws(()=>array1.compareToPrecision(array2,4))
done();
});
});
describe('arrayCompareToPrecision Float', function(){
require("../dataAnalysis/arrayCompareToPrecision.js");
const arrayl=new Float32Array([0.12]);
const array1=new Float32Array([0.12,1.123]);
const array2=new Float32Array([0.12,1.125]);
it("length mismatch", function(done){
assert.throws(()=>arrayl.compareToPrecision(array1,2))
done();
});
it("vector precision 2", function(done){
assert.doesNotThrow(()=>array1.compareToPrecision(array2,2))
done();
});
it("vector precision 3", function(done){
assert.throws(()=>array1.compareToPrecision(array2,3))
done();
});
});
describe('pca', function(){
const PCA=require("../dataAnalysis/pca.js");
const pca=new PCA();
it("getMatrix", function(done){
assert.equal(JSON.stringify(pca.getMatrix(2,2,1)),"[[1,1],[1,1]]")
done();
})
it("multipe ", function(done){
assert.equal(JSON.stringify(pca.multiply([[1,2],[3,4],[5,1]],[[2],[4]]))
,JSON.stringify([[10],[22],[14]]));
done();
})
it("transpose ", function(done){
assert.equal(JSON.stringify(pca.transpose([[1,2],[3,4],[5,1]],[[2],[4]]))
,JSON.stringify([[1,3,5],[2,4,1]]));
done();
})
it("x 1 matrices", function(done){
assert.equal(JSON.stringify(pca.multiply(m2x2,pca.getMatrix(2,1,1))),JSON.stringify([[23],[43]]));
assert.equal(JSON.stringify(pca.multiply(m2x2,pca.getMatrix(2,2,1))),JSON.stringify([[23,23],[43,43]]));
assert.equal(JSON.stringify(pca.multiply(m2x3,pca.getMatrix(3,3,1))),JSON.stringify([[36,36,36],[66,66,66]]));
done();
})
const generateVectorFunction=require("../dataAnalysis/generateVectorFunction.js");
const generateMatrixFunction=require("../dataAnalysis/generateMatrixFunction.js");
it("multiplyMatrix", function(done){
const sumVector=generateVectorFunction({
code:"returnValue+=vector[index]*matrix[index][column]; console.log({row:index,column:column,returnValue:returnValue})",
args:["matrix","column"],
returnValue:"0"
})
const multiplyMatrix=generateMatrixFunction({
code:"setElement(sumVector(element,bMatrix,columnOffset));",
args:["bMatrix"],
sumVector:sumVector,
returnValue:"()=>getMatrix()"
})
const matrix=[[1,2],[3,4],[5,6]];
console.log(multiplyMatrix(matrix,3,2,[[1,1],[1,1]]));
done();
})
describe('autocovariance', function(){ //autocorrelation
require("../dataAnalysis/autocorrelation.js");
const data=[0.05,0.01,-0.02,0.03,-0.04,0.06,0.02,-0.01,-0.03,0.04]
it("autocovariance", function(done){
assert.deepEqual(data.autocovariance(1).toFixed(5),-0.00046)
done();
});
it("autocorrelation", function(done){
assert.deepEqual(data.autocorrelation(1).toFixed(2),-0.38)
done();
});
});
});