function ComputeLayerValues(input){
var nodes = [];
var links = [];
var connected = [];
for (let i=0; i<NN['weights'][0].length; i++){
var node = {'id': i, 'LayerNum': 0, 'NodeNum': InputNames[i], 'value': input[i], 'valueScaled': 2*input[i]}
nodes.push(node)
}
let currentLayer = input
for (let l=0; l<NN['weights'].length; l++){
const weight = NN['weights'][l]
const bias = NN['bias'][l]
let nextLayer = bias
for (let i=0; i<weight.length; i++){
for (let j=0; j<weight[i].length; j++){
nextLayer[j] += weight[i][j]*currentLayer[i]
var link = {'source': l*NN['WidthLimit']+i, 'target': (l+1)*NN['WidthLimit']+j, 'weight': weight[i][j]}
if (Math.abs(link.weight) > 0.001 || NN.WidthLimit<=100){
links.push(link)
if (!connected.includes(link.source)){
connected.push(link.source)
}
if (!connected.includes(link.target)){
connected.push(link.target)
}
}
}
}
for (let k=0; k<nextLayer.length; k++){
let v = nextLayer[k]
if (l !== NN['weights'].length-1){
}
var node = {'id': (l+1)*NN['WidthLimit']+k, 'LayerNum': l+1, 'NodeNum': k, 'value': v, 'valueScaled': nextLayer[k]}
nodes.push(node)
nextLayer[k] = v
}
currentLayer = nextLayer
}
var nodesConnect = []
for (let n=0; n<nodes.length; n++){
if (connected.includes(nodes[n].id)){
nodesConnect.push(nodes[n])
}
}
return {"nodes": nodesConnect, "links": links};
}