mirror of
https://github.com/Findus23/nn_evaluate.git
synced 2024-09-19 14:53:44 +02:00
add typescript version
This commit is contained in:
parent
e4b82cf4d4
commit
fbd789d92e
11 changed files with 248 additions and 0 deletions
3
typescript/.gitignore
vendored
Normal file
3
typescript/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
node_modules
|
||||
public
|
||||
!public/index.html
|
33
typescript/build.js
Normal file
33
typescript/build.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
const esbuild = require('esbuild')
|
||||
|
||||
switch (process.argv[2]) {
|
||||
case "build":
|
||||
esbuild.build({
|
||||
entryPoints: ["main.ts"],
|
||||
target: "es2020",
|
||||
bundle: true,
|
||||
sourcemap: true,
|
||||
minify: true,
|
||||
color: true,
|
||||
outdir: "public",
|
||||
})
|
||||
break
|
||||
case "serve":
|
||||
esbuild.serve({
|
||||
port: 1234,
|
||||
servedir: "public"
|
||||
}, {
|
||||
entryPoints: ['main.ts'],
|
||||
bundle: true,
|
||||
target: "es2020",
|
||||
outdir: 'public',
|
||||
sourcemap: true,
|
||||
format: "esm", splitting: true
|
||||
// minify:true
|
||||
}).catch(() => process.exit(1))
|
||||
break
|
||||
default:
|
||||
console.log(process.argv)
|
||||
}
|
||||
|
||||
|
63
typescript/calc.ts
Normal file
63
typescript/calc.ts
Normal file
|
@ -0,0 +1,63 @@
|
|||
import {
|
||||
hiddenBias,
|
||||
hiddenLayerSize,
|
||||
hiddenWeight,
|
||||
means,
|
||||
outputBias,
|
||||
outputLayerSize,
|
||||
outputWeight,
|
||||
stds
|
||||
} from "./data";
|
||||
import {relu, sigmoid} from "./utils";
|
||||
|
||||
function calculate_layer(layerSize: number,
|
||||
parentLayer: number[],
|
||||
weight: number[][],
|
||||
bias: number[]): number[] {
|
||||
const new_layer: number[] = []
|
||||
for (let hl = 0; hl < layerSize; hl++) {
|
||||
let node = 0
|
||||
for (let parent = 0; parent < parentLayer.length; parent++) {
|
||||
node += parentLayer[parent] * weight[hl][parent]
|
||||
}
|
||||
node += bias[hl]
|
||||
new_layer.push(node)
|
||||
}
|
||||
return new_layer
|
||||
}
|
||||
|
||||
function evaluate(input: number[]): number[] {
|
||||
const scaled_input = scale_input(input)
|
||||
let hidden_layer = calculate_layer(hiddenLayerSize, scaled_input, hiddenWeight, hiddenBias)
|
||||
hidden_layer = hidden_layer.map(i => relu(i))
|
||||
let output_layer = calculate_layer(outputLayerSize, hidden_layer, outputWeight, outputBias)
|
||||
output_layer = output_layer.map(i => sigmoid(i))
|
||||
return output_layer
|
||||
}
|
||||
|
||||
function scale_input(input: number[]): number[] {
|
||||
return input.map((val, idx) =>
|
||||
((val - means[idx]) / stds[idx])
|
||||
)
|
||||
}
|
||||
|
||||
export function calculate_grid(mass: number, gamma: number, wp: number, wt: number, resolution: number, mode: number): number[] {
|
||||
const start = performance.now()
|
||||
const datalist: number[] = []
|
||||
for (let j = 0; j < resolution; j++) {
|
||||
for (let i = 0; i < resolution; i++) {
|
||||
const entry = [
|
||||
i / resolution * 60,
|
||||
j / resolution * 5.5,
|
||||
mass,
|
||||
gamma,
|
||||
wt,
|
||||
wp
|
||||
];
|
||||
datalist.push(evaluate(entry)[mode])
|
||||
}
|
||||
}
|
||||
const end = performance.now()
|
||||
console.info((end - start) + " ms")
|
||||
return datalist
|
||||
}
|
21
typescript/data.ts
Normal file
21
typescript/data.ts
Normal file
|
@ -0,0 +1,21 @@
|
|||
import data from "../pytorch_model.json"
|
||||
|
||||
export const means: number[] = data.means
|
||||
export const stds: number[] = data.stds
|
||||
export const hiddenWeight: number[][] = data["hidden.weight"]
|
||||
export const hiddenBias: number[] = data["hidden.bias"]
|
||||
export const outputWeight: number[][] = data["output.weight"]
|
||||
export const outputBias: number[] = data["output.bias"]
|
||||
export const hiddenLayerSize = hiddenBias.length
|
||||
export const inputLayerSize = means.length
|
||||
export const outputLayerSize = outputBias.length
|
||||
|
||||
|
||||
const ang = 30
|
||||
const v = 2
|
||||
const m = 1e24
|
||||
const gamma = 0.6
|
||||
const wp = 1e-4
|
||||
const wt = wp
|
||||
|
||||
export const input = [ang, v, m, gamma, wt, wp]
|
3
typescript/main.ts
Normal file
3
typescript/main.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
import {init} from "./ui";
|
||||
|
||||
init();
|
10
typescript/package.json
Normal file
10
typescript/package.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"devDependencies": {
|
||||
"@types/lodash": "^4.14.168",
|
||||
"esbuild": "^0.9.4",
|
||||
"typescript": "^4.2.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"lodash": "^4.17.21"
|
||||
}
|
||||
}
|
3
typescript/publish.sh
Executable file
3
typescript/publish.sh
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
|
||||
rsync -aP public/* lw1.at:/var/www/nn/
|
14
typescript/tsconfig.json
Normal file
14
typescript/tsconfig.json
Normal file
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"lib": [
|
||||
"es2017",
|
||||
"dom"
|
||||
],
|
||||
"noImplicitAny": true,
|
||||
"noEmit": true,
|
||||
"watch": true,
|
||||
"isolatedModules": true,
|
||||
"esModuleInterop": true,
|
||||
"resolveJsonModule": true
|
||||
}
|
||||
}
|
62
typescript/ui.ts
Normal file
62
typescript/ui.ts
Normal file
|
@ -0,0 +1,62 @@
|
|||
import {calculate_grid} from "./calc";
|
||||
import {valuesToImage} from "./utils";
|
||||
import throttle from "lodash/throttle"
|
||||
|
||||
export const massExpEl = <HTMLInputElement>document.getElementById("massExp")
|
||||
export const gammaPercentEl = <HTMLInputElement>document.getElementById("gammaPercent")
|
||||
export const wtFractionEl = <HTMLInputElement>document.getElementById("wtFraction")
|
||||
export const wpFractionEl = <HTMLInputElement>document.getElementById("wpFraction")
|
||||
export const resolutionEl = <HTMLInputElement>document.getElementById("resolution")
|
||||
export const smoothEl = <HTMLInputElement>document.getElementById("smooth")
|
||||
export const modeEl = <HTMLSelectElement>document.getElementById("mode")
|
||||
export const massExpLabel = document.getElementById("massExpLabel")
|
||||
export const gammaPercentLabel = document.getElementById("gammaPercentLabel")
|
||||
export const resolutionLabel = document.getElementById("resolutionLabel")
|
||||
export const wtFractionLabel = document.getElementById("wtFractionLabel")
|
||||
export const wpFractionLabel = document.getElementById("wpFractionLabel")
|
||||
export const canvas = <HTMLCanvasElement>document.getElementById("outputCanvas")
|
||||
|
||||
function update(): void {
|
||||
if (smoothEl.checked) {
|
||||
canvas.classList.remove("crisp")
|
||||
} else {
|
||||
canvas.classList.add("crisp")
|
||||
}
|
||||
|
||||
const mass = Math.pow(10, Number(massExpEl.value))
|
||||
massExpLabel.innerText = String(mass) + " kg"
|
||||
const gamma = Number(gammaPercentEl.value) / 100
|
||||
gammaPercentLabel.innerText = String(gamma)
|
||||
const wtFraction = Math.pow(10, Number(wtFractionEl.value))
|
||||
wtFractionLabel.innerText = String(wtFraction)
|
||||
const wpFraction = Math.pow(10, Number(wpFractionEl.value))
|
||||
wpFractionLabel.innerText = String(wpFraction)
|
||||
const resolution = Number(resolutionEl.value)
|
||||
resolutionLabel.innerText = String(resolution) + " px"
|
||||
const mode = Number(modeEl.value)
|
||||
const output = calculate_grid(mass, gamma, wpFraction, wtFraction, resolution, mode)
|
||||
const image = new ImageData(valuesToImage(output), resolution, resolution)
|
||||
const context = canvas.getContext('2d')
|
||||
context.canvas.width = resolution;
|
||||
context.canvas.height = resolution;
|
||||
context.putImageData(image, 0, 0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
export function init(): void {
|
||||
const start = performance.now()
|
||||
update()
|
||||
const end = performance.now()
|
||||
const testTime = end - start
|
||||
console.info(`initial run took ${testTime}ms`)
|
||||
const throttled = throttle(update, testTime)
|
||||
const type = (testTime > 500) ? "change" : "input"
|
||||
massExpEl.addEventListener(type, throttled)
|
||||
gammaPercentEl.addEventListener(type, throttled)
|
||||
wtFractionEl.addEventListener(type, throttled)
|
||||
wpFractionEl.addEventListener(type, throttled)
|
||||
resolutionEl.addEventListener(type, throttled)
|
||||
smoothEl.addEventListener("change", throttled)
|
||||
modeEl.addEventListener("change", throttled)
|
||||
}
|
13
typescript/utils.ts
Normal file
13
typescript/utils.ts
Normal file
|
@ -0,0 +1,13 @@
|
|||
export const relu = (x: number) => Math.max(0, x);
|
||||
|
||||
export const sigmoid = (x: number) => 1 / (1 + Math.exp(-x));
|
||||
|
||||
|
||||
export function valuesToImage(values: number[]): Uint8ClampedArray {
|
||||
const imagedata: number[] = [];
|
||||
for (let i = 0; i < values.length; i++) {
|
||||
const color = 255 - Math.round(values[i] * 255);
|
||||
imagedata.push(color, color, color / 2 + 127, 255)
|
||||
}
|
||||
return new Uint8ClampedArray(imagedata)
|
||||
}
|
23
typescript/yarn.lock
Normal file
23
typescript/yarn.lock
Normal file
|
@ -0,0 +1,23 @@
|
|||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@types/lodash@^4.14.168":
|
||||
version "4.14.168"
|
||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008"
|
||||
integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==
|
||||
|
||||
esbuild@^0.9.4:
|
||||
version "0.9.4"
|
||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.9.4.tgz#4480ffc4c1e5d5bb25958f889b5de0279bfb2d6f"
|
||||
integrity sha512-bF6laCiYE5+iAfZsX+v6Lwvi5QbvKN3tThxDIR2WLyLYzTzNn0ijdpqkvTVsafmRZjic2Nq1nkSf5RSWySDTjA==
|
||||
|
||||
lodash@^4.17.21:
|
||||
version "4.17.21"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
||||
|
||||
typescript@^4.2.3:
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3"
|
||||
integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==
|
Loading…
Reference in a new issue