{"version":3,"sources":["node_modules/browser-pack/_prelude.js","js/DynamicVariable.js","js/Edge.js","js/InputNode.js","js/Level.js","js/LevelController.js","js/Network.js","js/NetworkVisualization.js","js/Node.js","js/OutputNode.js","js/constants.js","js/levels.js","js/main.js"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","1","module","updateDynamicVariables","currentcomputetime","getCurrentComputeTime","DynamicVariable","value","arguments","undefined","_classCallCheck","this","time","fun","d3","_interopRequireWildcard","_constants","_DynamicVariable","casteljau1d","alpha","q","s","casteljau2d","x","map","y","Edge","from","to","weight","dloss","dweight","adjustable","multvis0","multvis1","edge","x0","constructor","name","noderadius","x1","unit","offset","b","bezier","c0","c1","sactivation","p1","p2","p3","eactivation","_this$generateActivat2","_slicedToArray","generateActivatedCubicBezierSplines","path","moveTo","bezierCurveTo","firstHalfBezier","getActivation","Math","abs","parameterths","_this","update","active","getdActivation","backupWeight","_Node2","InputNode","Node","activationcb","_super","allownegative","val","_this2","hasOwnProperty","userparamter","max","tempActivation","getActivationBackup","setUserParameter","_NetworkVisualization","Level","title","network","xlabels","trainXs","ylabels","trainYs","description","gradientdescentactive","backup","createUI","t0","Date","now","nv","NetworkVisualization","animatecallback","animate","addInteraction","resizeSVG","onenter","stop","table","html","onleave","select","document","querySelector","classList","remove","add","text","createTable","onclick","restore","gradientstep","_this3","columns","concat","k","thead","append","tbody","selectAll","data","enter","style","d","column","animatestep","updateUI","updatetable","closs","loss","toFixed","classed","rows","join","checked","gradientLoss","resetdloss","_this4","row","v","inputnodes","format","outputnodes","predict","error","sqerror","push","errorcolor","scaleSequential","domain","interpolator","interpolateRdYlGn","on","_k","_k2","target","_levels","LevelController","createEvents","levels","TutorialLevelA","SumLevel","AvgLevel","TutorialLevelB","TutorialLevelC","FahrenheitLevel","AndLevel","MaxLevel","WeatherLevel","XorLevel","NUMBER_OF_LEVELS","updateFooter","lid","attr","window","addEventListener","event","goBack","contains","goNext","showLevelByURL","onhashchange","key","setLevel","getCurrentLevel","hash","location","substring","id","showLevel","clevel","hide","show","Network","nodes","edges","outedges","input","console","_loop","temporarilyReplaceGetActivation","predicted","_i","restoreGetActivation","trainX","trainY","sqsum","_i2","_loop2","_loop3","_i3","_loop4","_i4","temporarilyReplaceGetdActivation","_i5","getdBias","_i6","getdWeight","_i7","_i8","restoreGetdActivation","stepsize","bias","_i9","pauseInput","clamp","mi","ma","min","sort","animating","animateloop","margin","svg","bbox","getBBox","setAttribute","width","height","filter","node","lineTo","parameterPosition","generateActivatedPath","closePath","Array","fill","generateActivatedPathMiddle","requestAnimationFrame","addToolTip","tooltip","set","that","local","nodedrag","drag","y0","v0","pauseAnimatedInput","get","forEach","each","edgedrag","weight0","_Edge","dactivation","sum","inedges","other","reverse","activation","eid","computeSum","backupBias","OutputNode","tempdActivation","getdActivationBackup","_Node","_InputNode","_OutputNode","_Network","_Level11","addnodeinfo","omega1","random","sin","exp","addChild","_super2","_super3","formula","nw","trainingdata","cloudiness","inside","temp","_super4","td","round","_this5","c2f","_super5","_this6","omega2","_super6","_this7","_super7","_this8","_super8","_this9","_super9","_this10","_super10"],"mappings":"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","file":"bundle.min.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i {\n const q = [(1 - alpha) * p[0] + alpha * p[1], (1 - alpha) * p[1] + alpha * p[2], (1 - alpha) * p[2] + alpha * p[3]];\n const r = [(1 - alpha) * q[0] + alpha * q[1], (1 - alpha) * q[1] + alpha * q[2]];\n const s = [(1 - alpha) * r[0] + alpha * r[1]];\n return [\n [p[0], q[0], r[0], s[0]],\n [s[0], r[1], q[2], p[3]]\n ];\n};\n\n\nconst casteljau2d = (p, alpha) => {\n const x = casteljau1d(p.map(c => c[0]), alpha);\n const y = casteljau1d(p.map(c => c[1]), alpha);\n\n return [\n [\n [x[0][0], y[0][0]],\n [x[0][1], y[0][1]],\n [x[0][2], y[0][2]],\n [x[0][3], y[0][3]]\n ],\n [\n [x[1][0], y[1][0]],\n [x[1][1], y[1][1]],\n [x[1][2], y[1][2]],\n [x[1][3], y[1][3]]\n ]\n ];\n};\n\n\nexport class Edge {\n constructor(from, to, weight) {\n this.from = from;\n this.to = to;\n this.weight = weight;\n this.dloss = 0;\n this.dweight = new DynamicVariable();\n this.adjustable = true;\n\n this.multvis0 = 1 / 3;\n this.multvis1 = 2 / 3;\n }\n\n bezier() {\n const edge = this;\n const x0 = edge.from.x + ((edge.from.constructor.name == \"InputNode\") ? noderadius : 0);\n const x1 = edge.to.x - ((edge.to.constructor.name == \"OutputNode\") ? noderadius : 0);\n return [\n [\n x0,\n edge.from.y\n ],\n [\n (x0 + x1) / 2,\n edge.from.y\n ],\n [\n (x0 + x1) / 2,\n edge.to.y - unit * (edge.offset)\n ],\n [\n x1,\n edge.to.y - unit * (edge.offset)\n ]\n ];\n }\n\n\n generateActivatedCubicBezierSplines(sactivation) {\n const b = this.bezier();\n const c0 = casteljau2d(b, this.multvis0);\n const c1 = casteljau2d(c0[1], (this.multvis1 - this.multvis0) / (1 - this.multvis0));\n return [c0[0], c1[0], c1[1]];\n }\n\n generateActivatedPath(sactivation, a1, a2) {\n const eactivation = sactivation * this.weight;\n let p1, p2, p3;\n [p1, p2, p3] = this.generateActivatedCubicBezierSplines(sactivation);\n //p.lineTo(edge.to.x, edge.to.y);\n const p = d3.path();\n p.moveTo(p1[0][0], p1[0][1] - unit * sactivation);\n p.bezierCurveTo(p1[1][0], p1[1][1] - unit * sactivation, p1[2][0], p1[2][1] - unit * sactivation, p1[3][0], p1[3][1] - unit * sactivation);\n p.bezierCurveTo(p2[1][0], p2[1][1] - unit * sactivation, p2[2][0], p2[2][1] - unit * eactivation, p2[3][0], p2[3][1] - unit * eactivation);\n p.bezierCurveTo(p3[1][0], p3[1][1] - unit * eactivation, p3[2][0], p3[2][1] - unit * eactivation, p3[3][0], p3[3][1] - unit * eactivation);\n\n return p;\n }\n\n generateActivatedPathMiddle(sactivation) {\n const eactivation = sactivation * this.weight;\n const p2 = this.generateActivatedCubicBezierSplines(sactivation)[1];\n //p.lineTo(edge.to.x, edge.to.y);\n const p = d3.path();\n p.moveTo(p2[0][0], p2[0][1] - unit * sactivation);\n p.bezierCurveTo(p2[1][0], p2[1][1] - unit * sactivation, p2[2][0], p2[2][1] - unit * eactivation, p2[3][0], p2[3][1] - unit * eactivation);\n return p;\n }\n\n\n normalizedParameterPosition() {\n const edge = this;\n return [(edge.from.x + edge.to.x) / 2, edge.firstHalfBezier()[3][1] - unit * edge.weight];\n }\n\n parameterPosition() {\n let sactivation = this.from.getActivation();\n if (Math.abs(sactivation) < parameterths) sactivation = (this.from.getActivation() < 0 ? -1 : 1) * parameterths;\n const p2 = this.generateActivatedCubicBezierSplines(sactivation)[1];\n const eactivation = sactivation * this.weight;\n return [p2[3][0], p2[3][1] - unit * eactivation];\n }\n\n getdWeight() {\n return this.dweight.update(() => {\n return (this.to.active() ? this.from.getActivation() * this.to.getdActivation() : 0);\n });\n }\n\n backup() {\n this.backupWeight = this.weight;\n }\n\n restore() {\n this.weight = this.backupWeight;\n }\n}\n","import {\n Node\n} from './Node.js';\n\nimport {\n DynamicVariable,\n updateDynamicVariables\n} from './DynamicVariable.js';\n\nexport class InputNode extends Node {\n constructor(activationcb = (() => 0)) {\n super();\n this.getActivation = activationcb;\n this.adjustable = false;\n this.allownegative = true;\n }\n\n setUserParameter(val) {\n if (!this.hasOwnProperty(\"userparamter\")) {\n this.getActivation = (() => this.userparamter);\n }\n if (!this.allownegative) {\n val = Math.max(0, val);\n }\n this.userparamter = val;\n\n updateDynamicVariables();\n }\n\n temporarilyReplaceGetActivation(tempActivation) {\n this.getActivationBackup = this.getActivation;\n this.getActivation = tempActivation;\n updateDynamicVariables();\n }\n\n restoreGetActivation() {\n this.getActivation = this.getActivationBackup;\n updateDynamicVariables();\n }\n\n pauseInput() {\n this.setUserParameter(this.getActivation());\n }\n}\n","//jshint: \"esversion\": 8\nimport * as d3 from 'd3';\n\nimport {\n NetworkVisualization\n} from './NetworkVisualization.js';\n\n\nimport {\n unit\n} from './constants.js';\n\n\nexport class Level {\n constructor(title, network, xlabels, trainXs, ylabels, trainYs, description) {\n this.title = title || \"\";\n\n this.network = network;\n this.trainXs = trainXs;\n this.trainYs = trainYs;\n this.xlabels = xlabels;\n this.ylabels = ylabels;\n\n this.description = description || \"\";\n this.gradientdescentactive = false;\n\n this.network.backup();\n }\n\n show() {\n this.createUI();\n this.t0 = Date.now();\n const nv = this.nv = new NetworkVisualization(this.network, () => this.animatecallback());\n nv.animate();\n nv.addInteraction();\n nv.resizeSVG(120);\n if (this.onenter)\n this.onenter();\n }\n\n hide() {\n if (this.nv)\n this.nv.stop();\n if (this.table)\n this.table.html('');\n if (this.onleave)\n this.onleave();\n\n d3.select(\"#levelinfo\").html('');\n }\n\n createUI() {\n document.querySelector(\".helper\").classList.remove(\"visible\");\n document.querySelector(\".mission\").classList.add(\"visible\");\n document.querySelector(\"#helpmebutton\").classList.remove(\"selected\");\n document.querySelector(\"#missionbutton\").classList.add(\"selected\");\n\n d3.select(\"#leveltitle\").text(this.title);\n d3.select(\"#description\").text(this.description);\n\n this.createTable();\n\n document.querySelector('.reset').onclick = (() => {\n this.network.restore();\n });\n\n document.querySelector('.single-step').onclick = (() => {\n this.gradientdescentactive = false;\n this.network.gradientstep(this.trainXs, this.trainYs, 0.01);\n });\n\n document.querySelector('.pause-resume').onclick = (() => {\n this.gradientdescentactive = !this.gradientdescentactive;\n });\n }\n\n createTable() {\n this.columns = this.xlabels.concat(this.ylabels).concat(this.ylabels.map(k => k + \" (vorausgesagt)\"));\n this.table = d3.select('#trainingtable');\n this.thead = this.table.append('thead');\n this.tbody = this.table.append('tbody');\n\n // append the header row\n this.thead.append('tr')\n .selectAll('th')\n .data(this.columns).enter()\n .append('th')\n .style(\"background-color\", (d, i) => (i >= this.xlabels.length) ? \"orange\" : \"yellow\")\n .text(function(column) {\n return column;\n });\n }\n\n animatecallback() {\n if (this.animatestep) this.animatestep(); //This function might be suitably overwritten by inherited levels\n if (this.gradientdescentactive) {\n for (let k = 0; k < 10; k++)\n this.network.gradientstep(this.trainXs, this.trainYs, 0.001);\n }\n this.updateUI();\n }\n\n updateUI() {\n if (this.gradientdescentactive && d3.select('#gradientanimating')) {\n document.querySelector('.pause-resume').classList.add(\"pause\");\n document.querySelector('.pause-resume').classList.remove(\"resume\");\n } else {\n document.querySelector('.pause-resume').classList.remove(\"pause\");\n document.querySelector('.pause-resume').classList.add(\"resume\");\n }\n\n this.updatetable();\n\n const closs = this.network.loss(this.trainXs, this.trainYs);\n d3.select(\"#totalerror\")\n .text(closs.toFixed(2));\n\n d3.select(\"#nextbutton\")\n .classed(\"disable\", closs > 0.02);\n\n d3.select(\".tabbed\")\n .classed(\"successful\", closs < 0.02);\n\n d3.select(\"#totalerrorterm\")\n .text(this.rows.map(r => `(${r[r.length-1]} - ${r[r.length-2]})²`).join(\" + \"));\n\n\n if (document.querySelector(\"#showgradient\").checked) {\n this.network.gradientLoss(this.trainXs, this.trainYs);\n } else {\n this.network.resetdloss();\n }\n }\n\n updatetable() {\n const tbody = this.tbody;\n\n let rows = [];\n this.rows = rows;\n for (let k in this.trainXs) {\n const row = this.trainXs[k].map((v, k) => this.network.inputnodes[k].format(v))\n .concat(this.trainYs[k].map((v, k) => this.network.outputnodes[k].format(v)))\n .concat(this.network.predict(this.trainXs[k]).map((v, k) => this.network.outputnodes[k].format(v)));\n row.error = this.network.sqerror(this.trainXs[k], this.trainYs[k]);\n rows.push(row);\n }\n\n var errorcolor = d3.scaleSequential().domain([1, 0])\n .interpolator(d3.interpolateRdYlGn);\n\n // create a row for each object in the data\n var trs = tbody.selectAll('tr')\n .data(rows)\n .join('tr')\n .on('click', (row, i) => {\n for (let k in this.network.inputnodes) {\n this.network.inputnodes[k].setUserParameter(this.trainXs[i][k]);\n }\n for (let k in this.network.outputnodes) {\n this.network.outputnodes[k].target = (this.trainYs[i][k]);\n }\n });\n\n // create a cell in each row for each column\n var cells = trs\n .selectAll('td')\n .data(d => d.map(v => {\n return {\n value: v,\n error: d.error\n };\n }))\n .join('td')\n .text(d => d.value)\n .style(\"background-color\", (d, i) => (i >= this.trainXs[0].length + this.trainYs[0].length) ? errorcolor(d.error) : 'white');\n\n\n }\n}\n","import * as d3 from 'd3';\n\nimport {\n TutorialLevelA,\n TutorialLevelB,\n TutorialLevelC,\n WeatherLevel,\n FahrenheitLevel,\n SumLevel,\n MaxLevel,\n XorLevel,\n AndLevel,\n AvgLevel\n} from './levels.js';\n\n\n\nexport class LevelController {\n constructor() {\n this.createEvents();\n this.levels = [ //generators for levels\n () => new TutorialLevelA(),\n () => new SumLevel(),\n () => new AvgLevel(),\n () => new TutorialLevelB(),\n () => new TutorialLevelC(),\n () => new FahrenheitLevel(),\n () => new AndLevel(),\n () => new MaxLevel(),\n () => new WeatherLevel(),\n () => new XorLevel()\n ];\n this.NUMBER_OF_LEVELS = this.levels.length;\n\n this.updateFooter(0);\n }\n updateFooter(lid) {\n d3.select('#navcircles').selectAll(\"a\").data(this.levels)\n .join(\"a\")\n .attr(\"href\", (d, i) => `index.html#${i+1}`)\n .classed(\"circ\", true)\n .classed(\"selected\", (d, i) => i == lid);\n\n d3.select('#backbutton').style(\"visibility\", lid == 0 ? \"hidden\" : \"visible\");\n d3.select('#nextbutton').style(\"visibility\", lid == this.NUMBER_OF_LEVELS - 1 ? \"hidden\" : \"visible\");\n }\n\n createEvents() {\n window.addEventListener('DOMContentLoaded', (event) => {\n document.querySelector(\"#backbutton\").onclick = (() => this.goBack());\n document.querySelector(\"#nextbutton\").onclick = (() => {\n if(!document.querySelector(\"#nextbutton\").classList.contains(\"disable\"))\n this.goNext();\n });\n this.showLevelByURL();\n });\n\n\n window.onhashchange = (event) => {\n this.showLevelByURL();\n };\n\n window.addEventListener('keydown', (event) => {\n const key = event.key;\n switch (event.key) {\n case \"ArrowLeft\":\n this.goBack();\n break;\n case \"ArrowRight\":\n this.goNext();\n break;\n }\n });\n }\n\n\n goNext() {\n this.setLevel((this.getCurrentLevel() + 1) % this.NUMBER_OF_LEVELS);\n }\n\n goBack() {\n this.setLevel((this.getCurrentLevel() - 1 + this.NUMBER_OF_LEVELS) % this.NUMBER_OF_LEVELS);\n }\n\n getCurrentLevel() {\n let hash = window.location.hash.substring(1);\n if (hash === \"\") {\n hash = 1;\n } else {\n hash = (hash | 0);\n }\n return hash - 1;\n }\n\n setLevel(id) {\n window.location.hash = id + 1;\n }\n\n showLevelByURL() {\n this.showLevel(this.getCurrentLevel());\n }\n\n showLevel(lid) {\n this.updateFooter(lid);\n if (this.clevel) {\n this.clevel.hide();\n }\n d3.select(\"#leveltitleprefix\").text(`Level ${lid + 1}: `);\n\n //regenerate level\n this.clevel = (this.levels[lid])();\n this.clevel.show();\n }\n}\n","import {\n updateDynamicVariables\n} from './DynamicVariable.js';\n\nexport class Network {\n constructor(nodes, inputnodes, outputnodes) {\n this.nodes = nodes;\n this.inputnodes = inputnodes;\n this.outputnodes = outputnodes;\n this.edges = [];\n\n for (let i in nodes) {\n for (let k in nodes[i].outedges) {\n this.edges.push(nodes[i].outedges[k]);\n }\n }\n }\n\n predict(input) {\n if (this.inputnodes.length != input.length) {\n console.error(\"Input does not fit input size of Network\");\n }\n\n //overwrite activation callbacks for input\n for (let i in this.inputnodes) {\n this.inputnodes[i].temporarilyReplaceGetActivation(() => input[i]);\n }\n\n //get prediction in this 'modified network'\n updateDynamicVariables();\n const predicted = this.outputnodes.map(o => o.getActivation());\n\n //restore input functions from backup\n for (let i in this.inputnodes) {\n this.inputnodes[i].restoreGetActivation();\n }\n return predicted;\n }\n\n sqerror(trainX, trainY) {\n const predicted = this.predict(trainX);\n let sqsum = 0;\n for (let k in predicted)\n sqsum += (predicted[k] - trainY[k]) * (predicted[k] - trainY[k]);\n return sqsum;\n }\n\n loss(trainXs, trainYs) {\n let sqsum = 0;\n for (let i in trainXs) {\n sqsum += this.sqerror(trainXs[i], trainYs[i]);\n }\n return sqsum;\n }\n\n resetdloss() {\n for (let i in this.nodes) {\n this.nodes[i].dloss = 0;\n }\n\n for (let i in this.edges) {\n this.edges[i].dloss = 0;\n }\n }\n\n //computes loss function and saves its gradient as parameters to objects in network\n gradientLoss(trainXs, trainYs) {\n let sqsum = 0;\n this.resetdloss();\n for (let k in trainXs) {\n const input = trainXs[k];\n const target = trainYs[k];\n //overwrite activation callbacks for input\n for (let i in this.inputnodes) {\n this.inputnodes[i].temporarilyReplaceGetActivation(() => input[i]);\n }\n\n //get prediction in this 'modified network'\n updateDynamicVariables();\n const predicted = this.outputnodes.map(o => o.getActivation());\n for (let i in predicted)\n sqsum += (predicted[i] - target[i]) * (predicted[i] - target[i]);\n\n for (let i in this.outputnodes) {\n this.outputnodes[i].temporarilyReplaceGetdActivation(() => 2 * (predicted[i] - target[i]));\n }\n updateDynamicVariables();\n\n for (let i in this.nodes) {\n this.nodes[i].dloss += this.nodes[i].getdBias();\n }\n\n for (let i in this.edges) {\n this.edges[i].dloss += this.edges[i].getdWeight();\n }\n\n\n\n //restore functions from backup\n for (let i in this.inputnodes) {\n this.inputnodes[i].restoreGetActivation();\n }\n\n for (let i in this.outputnodes) {\n this.outputnodes[i].restoreGetdActivation();\n }\n }\n return sqsum;\n }\n\n gradientstep(trainXs, trainYs, stepsize) {\n this.gradientLoss(trainXs, trainYs);\n\n for (let i in this.nodes) {\n if (this.nodes[i].constructor.name == \"Node\" && this.nodes[i].adjustable) { //only internal nodes\n this.nodes[i].bias -= stepsize * this.nodes[i].dloss;\n }\n }\n\n for (let i in this.edges) {\n if(this.edges[i].adjustable)\n this.edges[i].weight -= stepsize * this.edges[i].dloss;\n }\n updateDynamicVariables();\n }\n\n pauseAnimatedInput() {\n for (let i in this.inputnodes) {\n const node = this.inputnodes[i];\n node.pauseInput();\n }\n }\n\n backup() {\n for (let k in this.nodes) {\n this.nodes[k].backup();\n }\n\n for (let k in this.edges) {\n this.edges[k].backup();\n }\n }\n\n restore() {\n for (let k in this.nodes) {\n this.nodes[k].restore();\n }\n\n for (let k in this.edges) {\n this.edges[k].restore();\n }\n }\n}\n","import * as d3 from 'd3';\n\nimport {\n unit,\n parameterths,\n noderadius,\n} from './constants.js';\n\nimport {\n DynamicVariable,\n updateDynamicVariables\n} from './DynamicVariable.js';\n\nconst clamp = (x, mi, ma) => Math.min(ma, Math.max(mi, x));\n\nexport class NetworkVisualization {\n constructor(network, animatecallback) {\n const nodes = this.nodes = network.nodes;\n this.network = network;\n this.inputnodes = network.inputnodes;\n this.outputnodes = network.outputnodes;\n this.animatecallback = animatecallback;\n\n this.edges = [];\n\n for (let i in nodes) {\n for (let k in nodes[i].outedges) {\n this.edges.push(nodes[i].outedges[k]);\n }\n }\n //sort based on y coordinates of incoming edges\n this.edges = this.edges.sort((a, b) => (b.from.y - a.from.y));\n\n //arrow from http://jsfiddle.net/igbatov/v0ekdzw1/\n d3.select(\"svg\").append(\"svg:defs\").append(\"svg:marker\")\n .attr(\"id\", \"triangle\")\n .attr(\"refX\", 6)\n .attr(\"refY\", 6)\n .attr(\"markerWidth\", 30)\n .attr(\"markerHeight\", 30)\n .attr(\"markerUnits\", \"userSpaceOnUse\")\n .attr(\"orient\", \"auto\")\n .append(\"path\")\n .attr(\"d\", \"M 0 0 12 6 0 12 3 6\")\n .style(\"fill\", \"orange\");\n }\n\n stop() {\n this.animating = false;\n }\n\n animate() {\n this.animating = true;\n this.animateloop();\n }\n\n resizeSVG(margin = 0) {\n var svg = document.querySelector(\"svg\");\n var bbox = svg.getBBox();\n svg.setAttribute(\"viewBox\", `${bbox.x - margin} ${bbox.y - margin} ${Math.min(1000, bbox.width) + 2* margin} ${Math.min(1000, bbox.height) + 2*margin}`);\n }\n\n animateloop() {\n if (!this.animating) return;\n\n if (this.animatecallback)\n this.animatecallback();\n const nodes = this.nodes;\n const inputnodes = this.inputnodes;\n const outputnodes = this.outputnodes;\n const edges = this.edges;\n\n updateDynamicVariables();\n for (let i in nodes) {\n nodes[i].offset = nodes[i].bias;\n }\n for (let i in edges) {\n const edge = edges[i];\n edge.offset = edge.to.offset;\n edge.to.offset += edge.from.getActivation() * edge.weight;\n }\n\n d3.select(\"#nodes\").select(\".nodes\").selectAll(\"circle\").data(nodes)\n .join(\"circle\")\n .attr(\"cx\", (d) => d.x)\n .attr(\"cy\", (d) => d.y)\n .attr(\"r\", noderadius)\n .attr(\"fill\", d => d.constructor.name == \"InputNode\" ? \"yellow\" : (d.constructor.name == \"OutputNode\" ? \"orange\" : \"black\"))\n .attr(\"stroke\", \"black\")\n .attr(\"stroke-width\", 3)\n .attr(\"fill-opacity\", n => n.constructor.name == \"Node\" ? 0.2 : 1);\n\n\n d3.select(\"#parameters\").select(\".nodes\").selectAll(\"circle\").data(nodes.filter(node => node.adjustable))\n .join(\"circle\")\n .attr(\"cx\", n => n.x)\n .attr(\"cy\", n => n.y - unit * n.bias)\n .attr(\"r\", 15)\n .attr(\"fill\", \"white\")\n .attr(\"fill-opacity\", 0.5)\n .attr(\"stroke\", \"black\")\n .attr(\"stroke-width\", 2)\n .attr(\"stroke-opacity\", 0.5);\n\n\n const DLOSS_SCALE = 0.1;\n const DLOSS_CLAMP = 3;\n\n d3.select(\"#nodes\").select(\".gradient\").selectAll(\"path\").data(nodes.filter(node => node.dloss != 0 && node.adjustable))\n .join(\"path\")\n .attr(\"d\", (node) => {\n const p = d3.path();\n p.moveTo(node.x, node.y - unit * node.bias);\n p.lineTo(node.x, node.y - unit * (node.bias - clamp(node.dloss * DLOSS_SCALE, -DLOSS_CLAMP, DLOSS_CLAMP)));\n return p;\n })\n .attr(\"marker-end\", \"url(#triangle)\")\n .attr(\"stroke\", \"orange\")\n .attr(\"stroke-width\", 2)\n .attr(\"fill\", \"none\");\n\n d3.select(\"#edges\").select(\".gradient\").selectAll(\"path\").data(edges.filter(edge => edge.dloss != 0 && edge.adjustable))\n .join(\"path\")\n .attr(\"d\", (edge) => {\n const p = d3.path();\n const x = edge.parameterPosition()[0];\n const y = edge.parameterPosition()[1];\n p.moveTo(x, y);\n p.lineTo(x, y + unit * clamp(edge.dloss / edge.from.getActivation() * DLOSS_SCALE, -DLOSS_CLAMP, DLOSS_CLAMP));\n return p;\n })\n .attr(\"marker-end\", \"url(#triangle)\")\n .attr(\"stroke\", \"orange\")\n .attr(\"stroke-width\", 2)\n .attr(\"fill\", \"none\")\n .style(\"opacity\", edge => Math.min(0.5, Math.abs(edge.from.getActivation())));\n\n\n d3.select(\"#parameters\").select(\".edges\").selectAll(\"circle\").data(edges.filter(edge => edge.adjustable))\n .join(\"circle\")\n .attr(\"cx\", edge => edge.parameterPosition()[0])\n .attr(\"cy\", edge => edge.parameterPosition()[1])\n .attr(\"r\", 15)\n .attr(\"fill\", edge => (edge.weight > 0 ? \"blue\" : \"red\"))\n .attr(\"stroke\", \"black\")\n .attr(\"stroke-width\", 2)\n .attr(\"fill-opacity\", 0.5)\n .attr(\"stroke-opacity\", 0.5);\n\n\n d3.select(\"#input\").select(\".activations\").selectAll(\"rect\").data(inputnodes).join(\"rect\")\n .attr(\"x\", node => node.x)\n .attr(\"y\", node => node.y - Math.max(0, node.getActivation() * unit))\n .attr(\"width\", noderadius)\n .attr(\"height\", node => Math.abs(node.getActivation() * unit))\n .attr(\"fill\", \"blue\")\n .attr(\"fill-opacity\", 0.5);\n\n d3.select(\"#parameters\").select(\".input\").selectAll(\"circle\").data(inputnodes)\n .join(\"circle\")\n .attr(\"cx\", node => (node.x + noderadius))\n .attr(\"cy\", node => node.y - unit * node.getActivation())\n .attr(\"r\", 15)\n .attr(\"fill\", \"yellow\")\n .attr(\"fill-opacity\", 0.6)\n .attr(\"stroke\", \"black\")\n .attr(\"stroke-width\", 2)\n .attr(\"stroke-opacity\", 0.6);\n\n\n d3.select(\"#outputs\").select(\".flow\").selectAll(\"rect\").data(outputnodes).join(\"rect\")\n .attr(\"x\", node => node.x - noderadius)\n .attr(\"y\", node => node.y - Math.max(0, node.getActivation() * unit))\n .attr(\"width\", noderadius)\n .attr(\"height\", node => Math.abs(node.getActivation() * unit))\n .attr(\"fill\", \"blue\")\n .attr(\"fill-opacity\", 0.5);\n\n d3.select(\"#nodes\").select(\".target\").selectAll(\"text\")\n .data(outputnodes.filter(n => typeof n.target == 'number'))\n .join(\"text\")\n .attr(\"font-size\", 40)\n .attr(\"text-anchor\", \"left\")\n .attr(\"pointer-events\", \"none\")\n .text(n => \"Zielwert: \" + n.format(n.target))\n .attr(\"x\", n => n.x - noderadius)\n .attr(\"y\", n => n.y - unit * n.target)\n .attr(\"opacity\", 1)\n .attr(\"fill\", n => n.errorcolor());\n //.attr(\"fill\", \"orange\");\n\n\n d3.select(\"#nodes\").select(\".target\").selectAll(\"path\")\n .data(outputnodes.filter(n => typeof n.target == 'number'))\n .join(\"path\")\n .attr(\"d\", n => {\n const p = d3.path();\n p.moveTo(n.x - 10 - noderadius, n.y - unit * n.target);\n p.lineTo(n.x + noderadius, n.y - unit * n.target);\n return p;\n })\n //.attr(\"stroke\", \"orange\")\n .attr(\"stroke\", n => n.errorcolor())\n .attr(\"stroke-width\", 4)\n .attr(\"fill\", \"none\");\n\n\n d3.select(\"#nodes\").select(\".values\").selectAll(\"text\")\n .data(this.network.nodes)\n .join(\"text\")\n .attr(\"font-size\", 40)\n .attr(\"text-anchor\", \"middle\")\n .attr(\"alignment-baseline\", \"hanging\")\n .attr(\"pointer-events\", \"none\")\n //.attr(\"opacity\", 0.8)\n .text(n => n.format(n.getActivation()))\n .attr(\"x\", n => n.x)\n .attr(\"y\", n => n.y - clamp(unit * n.getActivation(), -70 + 40, 70));\n\n d3.select(\"#edges\").select(\".edges\").selectAll(\"path\").data(edges).join(\"path\")\n .attr(\"d\", edge => {\n const p = d3.path();\n const b = edge.bezier();\n if (edge.from.bias <= 0 || edge.from.constructor.name == \"InputNode\") {\n p.moveTo(b[0][0], b[0][1]);\n } else {\n //make \"waterproof\"\n p.moveTo(b[0][0], b[0][1] - unit * edge.from.bias);\n p.lineTo(b[0][0], b[0][1]);\n }\n\n //p.lineTo(edge.to.x, edge.to.y);\n\n p.bezierCurveTo(b[1][0], b[1][1], b[2][0], b[2][1], b[3][0], b[3][1]);\n if (edge.offset < 0) //make \"waterproof\"\n p.lineTo(b[3][0], b[3][1] + unit * edge.offset);\n return p;\n })\n .attr(\"stroke\", \"black\")\n .attr(\"stroke-width\", 2)\n .attr(\"fill\", \"none\");\n\n\n d3.select(\"#edges\").select(\".activations\").selectAll(\"path\").data(edges).join(\"path\")\n .attr(\"d\", edge => {\n const p = edge.generateActivatedPath(edge.from.getActivation());\n const b = edge.bezier();\n p.lineTo(b[3][0], b[3][1]);\n p.bezierCurveTo(b[2][0], b[2][1], b[1][0], b[1][1], b[0][0], b[0][1]);\n p.closePath();\n return p;\n })\n .attr(\"fill\", edge => edge.weight >= 0 ? \"blue\" : \"red\")\n .attr(\"fill-opacity\", 0.5);\n\n\n const N = 1;\n d3.select(\"#edges\").select(\".factorlines\").selectAll(\"g\").data(edges.filter(e => e.adjustable)).join(\"g\")\n .selectAll(\"path\")\n .data(edge => Array(Math.abs(edge.from.getActivation()) > parameterths ? 0 : N).fill(edge))\n .join(\"path\")\n .attr(\"d\", (edge, k) => edge.generateActivatedPathMiddle(parameterths * (edge.from.getActivation() < 0 ? -1 : 1) * (k + 1) / N))\n .attr(\"stroke\", edge => (edge.weight >= 0 ? \"blue\" : \"red\"))\n .attr(\"stroke-width\", 2)\n .attr(\"stroke-opacity\", 0.5)\n .attr(\"fill\", \"none\");\n requestAnimationFrame(() => this.animateloop());\n }\n\n\n addInteraction() {\n const nodes = this.nodes;\n\n const that = this;\n const tooltip = d3.local();\n const addToolTip = function() {\n tooltip.set(\n this,\n d3.select(\"#tooltip\").append(\"text\").style(\"display\", \"none\")\n );\n };\n \n const nodedrag = d3.drag()\n .on(\"start\", function() {\n var current = d3.select(this);\n this.y0 = d3.event.y;\n const node = d3.select(this).data()[0];\n if (node.adjustable) {\n this.v0 = node.bias;\n that.network.pauseAnimatedInput();\n if(d3.event.active === 0) {\n const tooltipForThis = tooltip.get(this);\n tooltipForThis.style(\"display\", \"block\");\n }\n }\n\n if (node.constructor.name == \"InputNode\") {\n this.v0 = node.getActivation();\n node.setUserParameter(this.v0);\n }\n\n })\n .on(\"drag\", function() {\n const node = d3.select(this).data()[0];\n if (node.adjustable) {\n node.bias = clamp(this.v0 - (d3.event.y - this.y0) / unit, -4, 4);\n //node.y = d3.event.y + this.deltaX;\n const tooltipForThis = tooltip.get(this);\n tooltipForThis\n .attr(\"x\", node.x)\n .attr(\"y\", node.y - unit * node.bias)\n .text(`+ ${node.format(node.bias)}`);\n }\n if (node.constructor.name == \"InputNode\") {\n node.setUserParameter(clamp(this.v0 - (d3.event.y - this.y0) / unit, -4, 4));\n for (let k in that.network.outputnodes) {\n delete that.network.outputnodes[k].target;\n }\n }\n })\n .on(\"end\", function() {\n if (d3.event.active === 0) {\n const tooltipForThis = tooltip.get(this);\n tooltipForThis.style(\"display\", \"none\");\n }\n });\n\n const nodeDragSelections = [\n d3.select(\"#nodes\").selectAll(\"circle\"),\n d3.select(\"#parameters\").select(\".input\").selectAll(\"circle\"),\n d3.select(\"#parameters\").select(\".nodes\").selectAll(\"circle\"),\n d3.select(\"#input\").selectAll(\"rect\"),\n ]\n nodeDragSelections.forEach(s=>{\n s.each(addToolTip);\n nodedrag(s);\n });\n\n const edgedrag = d3.drag()\n .on(\"start\", function() {\n const edge = d3.select(this).data()[0];\n if (edge.adjustable) {\n var current = d3.select(this);\n this.y0 = d3.event.y;\n this.weight0 = edge.weight;\n that.network.pauseAnimatedInput();\n if(d3.event.active === 0) {\n const tooltipForThis = tooltip.get(this);\n tooltipForThis.style(\"display\", \"block\");\n }\n }\n })\n .on(\"drag\", function() {\n const edge = d3.select(this).data()[0];\n if (edge.adjustable) {\n let sactivation = edge.from.getActivation();\n if (Math.abs(sactivation) < parameterths) sactivation = (edge.from.getActivation() < 0 ? -1 : 1) * parameterths;\n //if (Math.abs(edge.from.getActivation()) > 0.001) {\n edge.weight = clamp(this.weight0 - (d3.event.y - this.y0) / sactivation / unit, -4, 4);\n //}\n const tooltipForThis = tooltip.get(this);\n tooltipForThis\n .attr(\"x\", edge.parameterPosition()[0])\n .attr(\"y\", edge.parameterPosition()[1])\n .text(`× ${edge.weight.toFixed(2)}`);\n }\n })\n .on(\"end\", function() {\n if (d3.event.active === 0) {\n const tooltipForThis = tooltip.get(this);\n tooltipForThis.style(\"display\", \"none\");\n }\n });\n\n const edgeDragSelections = [\n d3.select(\"#edges\").selectAll(\"path, circle\"),\n d3.select(\"#parameters\").select(\".edges\").selectAll(\"circle\"),\n ];\n edgeDragSelections.forEach(s=>{\n s.each(addToolTip);\n edgedrag(s);\n });\n }\n}\n","//jshint: \"esversion\": 8\n\nimport {\n Edge\n} from './Edge.js';\n\nimport {\n DynamicVariable,\n updateDynamicVariables\n} from './DynamicVariable.js';\n\nexport class Node {\n constructor() {\n this.dactivation = new DynamicVariable(0);\n this.sum = new DynamicVariable(0);\n this.bias = 0;\n this.dloss = 0;\n this.outedges = [];\n this.inedges = [];\n this.adjustable = true;\n }\n\n addChild(other, weight, reverse = true) {\n const edge = new Edge(this, other, weight);\n this.outedges.push(edge);\n if (reverse) {\n other.inedges.push(edge);\n }\n }\n\n computeSum() {\n return this.sum.update(() => {\n let activation = this.bias;\n for (let eid in this.inedges) {\n const edge = this.inedges[eid];\n activation += edge.weight * edge.from.getActivation();\n }\n return activation;\n });\n }\n\n getActivation() {\n return Math.max(0, this.computeSum()); //ReLu\n }\n\n\n active() {\n return this.computeSum() >= 0;\n }\n\n getdActivation() {\n return this.dactivation.update(() => {\n let dactivation = 0;\n for (let eid in this.outedges) {\n const edge = this.outedges[eid];\n if (edge.to.active()) {\n dactivation += edge.weight * edge.to.getdActivation();\n }\n }\n return dactivation;\n });\n }\n\n getdBias() {\n return (this.active() ? this.getdActivation() : 0);\n }\n\n format(v) {\n return v.toFixed(1);\n }\n\n backup() {\n this.backupBias = this.bias;\n }\n\n restore() {\n this.bias = this.backupBias;\n }\n}\n","import * as d3 from 'd3';\n\nimport {\n Node\n} from './Node.js';\n\nimport {\n DynamicVariable,\n updateDynamicVariables\n} from './DynamicVariable.js';\n\n// a node that just sums up inputs (no ReLu to enable negative outputs)\n\nexport class OutputNode extends Node {\n constructor() {\n super();\n this.bias = 0;\n this.adjustable = false;\n }\n\n getActivation() {\n return this.computeSum(); // no bias, no ReLu\n }\n\n //this function might be overwriten, such that it is dependent on loss function\n getdActivation() {\n return 1; //likely will be overwritten\n }\n\n active() {\n return true;\n }\n\n temporarilyReplaceGetdActivation(tempdActivation) {\n this.getdActivationBackup = this.getdActivation;\n this.getdActivation = tempdActivation;\n updateDynamicVariables();\n }\n\n restoreGetdActivation() {\n this.getdActivation = this.getdActivationBackup;\n updateDynamicVariables();\n }\n\n errorcolor() {\n const n = this;\n return d3.scaleSequential().domain([1, 0]).interpolator(d3.interpolateRdYlGn)(Math.abs(n.target - n.getActivation()));\n }\n}\n","export const unit = 35;\nexport const parameterths = 0.3;\nexport const noderadius = 80;\n","//jshint: \"esversion\": 8\nimport * as d3 from 'd3';\n\nimport {\n Node,\n} from './Node.js';\n\nimport {\n InputNode\n} from './InputNode.js';\n\nimport {\n OutputNode\n} from './OutputNode.js';\n\nimport {\n Network\n} from './Network.js';\n\nimport {\n Level\n} from './Level.js';\n\nimport {\n unit,\n noderadius\n} from './constants.js';\n\n\nconst addnodeinfo = (node, text, offset = noderadius + 30) => {\n d3.select(\"#levelinfo\").append(\"text\")\n .text(text)\n .attr(\"pointer-events\", \"none\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"font-size\", 20)\n .attr(\"x\", node.x)\n .attr(\"y\", node.y + offset);\n};\n\n\nexport class TutorialLevelA extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega1 * Date.now() / 1000) * Math.exp(-0.1 * (Date.now() - this.t0) / 1000)),\n new OutputNode()\n ];\n nodes[0].x = 200;\n nodes[0].y = 500;\n nodes[0].allownegative = true;\n nodes[1].x = 800;\n nodes[1].y = 550;\n nodes[0].addChild(nodes[1], 1);\n\n const f = c => ((c * 2));\n const trainXs = [1, 2, 3];\n const trainYs = trainXs.map(f);\n\n super(\"Verdopple den Input!\",\n new Network(\n nodes,\n [nodes[0]], //input nodes\n [nodes[1]] //output nodes\n ),\n [\"input\"], trainXs.map(x => [x]), //temperatures are internally divided by 10.\n [\"desired output\"], trainYs.map(x => [x]),\n \"Stelle in diesem einfachen Netz das Gewicht so ein, dass sich der Input verdoppelt, d.h. der Output soll den doppelten Inputwert ergeben (siehe Zielwert). Wenn du es geschafft hast, schalte mit dem Pfeil unten rechts weiter zum nächsten Level! \"\n );\n\n this.animatestep = function() {\n nodes[1].target = f(nodes[0].getActivation());\n };\n\n this.onenter = function() {\n addnodeinfo(nodes[0], \"Verändere hier den Inputwert!\");\n addnodeinfo(nodes[1], \"Der Output\");\n\n d3.select(\"#levelinfo\").append(\"text\")\n .text(\"Der Multiplikationsfaktor (das “Gewicht”)\")\n .attr(\"pointer-events\", \"none\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"font-size\", 20)\n .attr(\"x\", (nodes[0].x + nodes[1].x) / 2)\n .attr(\"y\", (nodes[0].y + nodes[1].y) / 2 - 100);\n\n document.querySelector(\".trainingdata\").classList.remove(\"visible\");\n };\n\n this.onleave = function() {\n document.querySelector(\".trainingdata\").classList.add(\"visible\");\n };\n }\n}\n\nexport class TutorialLevelB extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => 0.5 + 2 * Math.sin(omega1 * Date.now() / 1000) * Math.exp(-0.1 * (Date.now() - this.t0) / 1000)),\n new Node(),\n new OutputNode()\n ];\n nodes[0].allownegative = true;\n nodes[0].x = 200;\n nodes[0].y = 500;\n nodes[1].x = 500;\n nodes[1].y = 550;\n nodes[1].adjustable = false;\n\n nodes[2].x = 800;\n nodes[2].y = 500;\n nodes[0].addChild(nodes[1], -2);\n nodes[1].addChild(nodes[2], 1);\n nodes[1].outedges[0].adjustable = false;\n\n const f = c => Math.max(0, (c * 1));\n const trainXs = [-2, -1, 0, 1, 2, 3];\n const trainYs = trainXs.map(f);\n\n super(\"Lass nur positive Werte durch das Netz!\",\n new Network(\n nodes,\n [nodes[0]], //input nodes\n [nodes[2]] //output nodes\n ),\n [\"Input\"], trainXs.map(x => [x]), //temperatures are internally divided by 10.\n [\"Output\"], trainYs.map(x => [x]),\n \"Stelle das Netz so ein, dass der Output nur die positive Inputs durchlässt, und für andere (negative) Inputs die 0 anzeigt. Das mittlere Neuron verwendet dafür eine Aktivierungsfunktion.\"\n );\n\n\n this.animatestep = function() {\n nodes[2].target = f(nodes[0].getActivation());\n };\n\n this.onenter = function() {\n addnodeinfo(nodes[1], `Die mittleren Neuronen ignoriert negative Inputs.`);\n };\n\n }\n}\n\nexport class TutorialLevelC extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => -0.2 + 1 * Math.sin(omega1 * Date.now() / 1000) * Math.exp(-0.1 * (Date.now() - this.t0) / 1000)),\n new Node(),\n new OutputNode()\n ];\n nodes[0].allownegative = true;\n nodes[0].x = 200;\n nodes[0].y = 500;\n nodes[1].x = 500;\n nodes[1].y = 550;\n nodes[1].adjustable = true;\n nodes[2].x = 800;\n nodes[2].y = 500;\n nodes[0].addChild(nodes[1], 1);\n nodes[1].addChild(nodes[2], 1);\n\n nodes[0].outedges[0].adjustable = false;\n nodes[1].outedges[0].adjustable = false;\n\n nodes[1].bias = 1;\n\n const f = c => Math.max(0, (c - 1));\n const trainXs = [-2, -1, 0, 1, 2, 3];\n const trainYs = trainXs.map(f);\n\n super(\"Verändere den Bias!\",\n new Network(\n nodes,\n [nodes[0]], //input nodes\n [nodes[2]] //output nodes\n ),\n [\"Input\"], trainXs.map(x => [x]), //temperatures are internally divided by 10.\n [\"Output\"], trainYs.map(x => [x]),\n \"Dieses Netz hat einen neuen Parameter: den Bias. Stelle ihn so ein, dass der Output um 1.0 kleiner ist ist als der Input. Sollte der Input allerdings kleiner als 1 sein, soll der Output 0 ergeben.\"\n );\n\n\n this.animatestep = function() {\n nodes[2].target = f(nodes[0].getActivation());\n };\n\n this.onenter = function() {\n addnodeinfo(nodes[1], `Am Input des mittleren Neurons befindet sich nun ein einstellbarer Bias.`);\n };\n\n\n }\n}\n\nexport class WeatherLevel extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega1 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n new InputNode(() => 1),\n\n new Node(),\n new Node(),\n\n new OutputNode()\n ];\n\n for (let i in [2, 3]) {\n nodes[[2, 3][i]].bias = 2 * (Math.random() - 0.5);\n }\n\n //output from console\n nodes[0].x = 200;\n nodes[0].y = 400;\n nodes[1].x = 200;\n nodes[1].y = 600;\n nodes[2].x = 509;\n nodes[2].y = 300;\n nodes[3].x = 500;\n nodes[3].y = 700;\n nodes[4].x = 800;\n nodes[4].y = 500;\n\n nodes[0].addChild(nodes[2], 1);\n nodes[0].addChild(nodes[3], 1);\n nodes[1].addChild(nodes[2], 1);\n nodes[1].addChild(nodes[3], 1);\n nodes[2].addChild(nodes[4], 1);\n nodes[3].addChild(nodes[4], 1);\n\n const nw = new Network(\n nodes,\n [nodes[0], nodes[1]], //input nodes\n [nodes[4]] //output nodes\n );\n\n const trainingdata = [{\n cloudiness: 0,\n inside: 0,\n },\n {\n cloudiness: 0.5,\n inside: 0,\n },\n {\n cloudiness: 1,\n inside: 0,\n },\n {\n cloudiness: 1,\n inside: 1,\n },\n {\n cloudiness: 0.5,\n inside: 1,\n },\n {\n cloudiness: 0,\n inside: 1,\n }\n ];\n const formula = (c, i) => (i == 1) ? (2.1 - 0.1 * c) : (2.5 - 1.2 * c);\n\n //nodes[0].format = cls => `cloudiness: ${cls.toFixed(1)}`;\n //nodes[1].format = v => Math.round(v) == 1 ? '1 (inside)' : '0 (outside)';\n nodes[1].format = v => v.toFixed(0);\n nodes[4].format = temp => `${(temp*10).toFixed(0)}°C`;\n super(\"Erstelle eine einfache Wettervorhersage!\", nw,\n [\"Bewölkung\", \"Innenraum\"], trainingdata.map(td => [td.cloudiness, td.inside]),\n [\"Temperatur\"], trainingdata.map(td => [formula(td.cloudiness, td.inside)]),\n \"Draußen (d.h. Innenraumwert = 0) hängt die Temperatur davon ab, wie bewölkt es ist: Je bewölkter der Himmel ist, desto niedriger die Temperatur. In Innenräumen (d.h. Innenraumwert = 1) ist die Temperatur fast immer 20°C.\"\n );\n\n this.animatestep = function() {\n //TODO add some nicer visualization for inside, cloudiness, and temperature.\n\n nodes[0].setUserParameter(Math.min(1, Math.max(0, (nodes[0].getActivation()))));\n //round input\n nodes[1].setUserParameter(Math.min(1, Math.max(0, Math.round(nodes[1].getActivation()))));\n\n nodes[4].target = formula(nodes[0].getActivation(), nodes[1].getActivation());\n };\n\n this.onenter = function() {\n addnodeinfo(nodes[0], `Bewölkung`, -noderadius - 20);\n addnodeinfo(nodes[1], `drinnen/draußen`);\n addnodeinfo(nodes[4], `vorhergesagte Temperatur`);\n };\n }\n\n}\n\n\nexport class FahrenheitLevel extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega1 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n new Node(), //TODO: No ReLu Nodes here!\n new OutputNode()\n ];\n\n for (let i in [1]) {\n nodes[[1][i]].bias = 1 + 2 * (Math.random());\n }\n\n nodes[0].x = 200;\n nodes[0].y = 500;\n nodes[0].allownegative = false;\n nodes[1].x = 500;\n nodes[1].y = 550;\n nodes[2].x = 800;\n nodes[2].y = 500;\n\n nodes[0].addChild(nodes[1], 1);\n nodes[1].addChild(nodes[2], 1);\n nodes[1].outedges[0].adjustable = false;\n\n const c2f = c => ((c * 1.8) + 32);\n const trainXs = [0, 10, 20, 30];\n const trainYs = trainXs.map(c2f);\n\n nodes[0].format = temp => `${(temp*10).toFixed(0)}°C`;\n nodes[1].format = temp => `${(temp*10).toFixed(0)}`;\n nodes[2].format = temp => `${(temp*10).toFixed(0)}°F`;\n super(\"Wandle Celsius in Fahrenheit um!\",\n new Network(\n nodes,\n [nodes[0]], //input nodes\n [nodes[2]] //output nodes\n ),\n [\"Celsius\"], trainXs.map(v => [v / 10]), //temperatures are internally divided by 10.\n [\"Fahrenheit\"], trainYs.map(v => [v / 10]),\n \"Ein positiver Temperaturwert in Grad Celsius (links) soll in einen Wert in Grad Fahrenheit umgewandelt werden (rechts). Stell die Parameter (blaue und weiße Regler) des Netzes so ein, dass der Output dem Zielwert jeden Inputs entspricht. In der Tabelle unten kannst du die korrekten Werte ablesen.\"\n );\n this.animatestep = function() {\n nodes[2].target = c2f(nodes[0].getActivation() * 10) / 10;\n };\n\n }\n}\n\n\nexport class SumLevel extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n const omega2 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega1 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega2 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n new OutputNode()\n ];\n\n nodes[2].bias = 0;\n\n nodes[0].x = 200;\n nodes[0].y = 300;\n nodes[0].allownegative = true;\n nodes[1].x = 200;\n nodes[1].y = 700;\n nodes[1].allownegative = true;\n\n nodes[2].x = 800;\n nodes[2].y = 500;\n\n nodes[0].addChild(nodes[2], 1);\n nodes[1].addChild(nodes[2], -1);\n\n\n const c2f = c => ((c * 1.8) + 32);\n const trainXs = [\n [0, 0],\n [0, 1],\n [2, 1],\n [3, 1],\n [4, 2],\n [0, 2]\n ];\n const trainYs = trainXs.map(p => [p[0] + p[1]]);\n\n super(\"Addiere die beiden Inputwerte!\",\n new Network(\n nodes,\n [nodes[0], nodes[1]], //input nodes\n [nodes[2]] //output nodes\n ),\n [\"Summand 1\", \"Summand 2\"], trainXs, //temperatures are internally divided by 10.\n [\"Summe\"], trainYs,\n \"Stelle die Gewichte des Netzes so ein, dass der Outputwert (rechts) die Summe beider Inputwerte ergibt. Die Voraussagen des Netzes sollen möglichst den Werten der Trainingsdaten entsprechen, die du in der Tabelle unten siehst.\"\n );\n this.animatestep = function() {\n nodes[2].target = (nodes[0].getActivation()) + (nodes[1].getActivation());\n };\n\n }\n}\n\n\nexport class AndLevel extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n const omega2 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => 1),\n new InputNode(() => 1),\n\n new Node(),\n\n new OutputNode()\n ];\n\n for (let i in [2]) {\n nodes[[2][i]].bias = 2 * (Math.random());\n }\n\n\n nodes[0].x = 200;\n nodes[0].y = 350;\n nodes[1].x = 200;\n nodes[1].y = 650;\n nodes[2].x = 500;\n nodes[2].y = 500;\n\n nodes[3].x = 800;\n nodes[3].y = 500;\n\n nodes[0].addChild(nodes[2], 1);\n //nodes[0].addChild(nodes[3], 1);\n nodes[1].addChild(nodes[2], -0.2);\n\n\n nodes[2].addChild(nodes[3], 1);\n //nodes[1].addChild(nodes[3], 1);\n\n const nw = new Network(\n nodes,\n [nodes[0], nodes[1]], //input nodes\n [nodes[3]] //output nodes\n );\n const trainXs = [\n [0, 0],\n [1, 0],\n [0, 1],\n [1, 1]\n ];\n const trainYs = trainXs.map(p => [(p[0] * p[1])]);\n\n super(\"Finde heraus ob beide Inputs auf 1 gestellt sind!\",\n nw,\n [\"Bit 1\", \"Bit 2\"], trainXs, //temperatures are internally divided by 10.\n [\"AND\"], trainYs,\n \"Die Inputwerte des Netzes sind entweder 0 oder 1. Der Outputwert rechts soll nur dann 1 sein, wenn beide Inputwerte 1 sind. Anderfalls soll er 0 sein.\"\n );\n this.animatestep = function() {\n nodes[0].format = v => Math.round(v);\n nodes[1].format = v => Math.round(v);\n nodes[0].setUserParameter(Math.min(1, Math.max(0, Math.round(nodes[0].getActivation()))));\n nodes[1].setUserParameter(Math.min(1, Math.max(0, Math.round(nodes[1].getActivation()))));\n\n nodes[3].target = (nodes[0].getActivation() * nodes[1].getActivation());\n };\n\n }\n}\n\nexport class MaxLevel extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n const omega2 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => 1.5 + 1 * Math.sin(omega1 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n new InputNode(() => 1 + 1 * Math.sin(omega2 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n\n new Node(),\n\n new OutputNode()\n ];\n\n for (let i in [2]) {\n nodes[[2][i]].bias = 2 * (Math.random() - 0.5);\n }\n\n\n nodes[0].x = 200;\n nodes[0].y = 350;\n nodes[1].x = 200;\n nodes[1].y = 650;\n nodes[2].x = 500;\n nodes[2].y = 400;\n\n nodes[3].x = 800;\n nodes[3].y = 500;\n\n nodes[0].addChild(nodes[2], 1);\n //nodes[0].addChild(nodes[3], 1);\n nodes[1].addChild(nodes[2], -0.2);\n\n\n nodes[2].addChild(nodes[3], 1);\n nodes[1].addChild(nodes[3], 1);\n\n const nw = new Network(\n nodes,\n [nodes[0], nodes[1]], //input nodes\n [nodes[3]] //output nodes\n );\n const trainXs = [0, 0, 0, 0, 0, 0, 0].map(v => [Math.random(), Math.random()]);\n const trainYs = trainXs.map(p => [Math.max(p[0], p[1])]);\n\n super(\"Berechne das Maximum der Inputwerte!\",\n nw,\n [\"Input 1\", \"Input 2\"], trainXs, //temperatures are internally divided by 10.\n [\"Maximum\"], trainYs,\n \"Der Output rechts soll dem Maximalwert der beiden Inputs entsprechen. Tipp: max(a, b) = max(0, a-b)+b. Denk daran, dass das mittlere Neuron negative Werte ignoriert.\"\n );\n this.animatestep = function() {\n nodes[3].target = Math.max(nodes[0].getActivation(), nodes[1].getActivation());\n };\n\n }\n}\n\n\n\nexport class XorLevel extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n const omega2 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega1 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega2 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n\n new Node(),\n new Node(),\n new Node(),\n\n new OutputNode()\n ];\n\n for (let i in [2, 3, 4]) {\n nodes[[2, 3, 4][i]].bias = 2 * (Math.random() - 0.5);\n }\n\n\n nodes[0].x = 200;\n nodes[0].y = 400;\n nodes[1].x = 200;\n nodes[1].y = 600;\n nodes[2].x = 500;\n nodes[2].y = 300;\n nodes[3].x = 500;\n nodes[3].y = 500;\n nodes[4].x = 500;\n nodes[4].y = 700;\n nodes[5].x = 800;\n nodes[5].y = 500;\n\n nodes[0].addChild(nodes[2], 1);\n nodes[0].addChild(nodes[3], 1);\n nodes[0].addChild(nodes[4], 1);\n nodes[1].addChild(nodes[2], 1);\n nodes[1].addChild(nodes[3], 1);\n nodes[1].addChild(nodes[4], 1);\n\n nodes[2].addChild(nodes[5], 1);\n nodes[3].addChild(nodes[5], 1);\n nodes[4].addChild(nodes[5], 1);\n\n const nw = new Network(\n nodes,\n [nodes[0], nodes[1]], //input nodes\n [nodes[5]] //output nodes\n );\n const trainXs = [\n [0, 0],\n [1, 0],\n [0, 1],\n [1, 1]\n ];\n const trainYs = [\n [0],\n [1],\n [1],\n [0]\n ];\n\n super(\"Berechne das exklusive Oder (XOR) der Inputwerte!\",\n nw,\n [\"Bit 1\", \"Bit 2\"], trainXs, //temperatures are internally divided by 10.\n [\"XOR\"], trainYs,\n \"Nehmen wir an, dass das Netz nur 0 oder 1 als Inputwerte akzeptiert. Der Output des Netzes soll 1 sein, wenn beide Inputs verschieden sind. Andernfalls (wenn also beide Inputs gleich sind) soll der Output 0 sein.\"\n );\n this.animatestep = function() {\n //round input\n nodes[0].format = v => Math.round(v);\n nodes[1].format = v => Math.round(v);\n nodes[0].setUserParameter(Math.min(1, Math.max(0, Math.round(nodes[0].getActivation()))));\n nodes[1].setUserParameter(Math.min(1, Math.max(0, Math.round(nodes[1].getActivation()))));\n nodes[5].target = ((nodes[0].getActivation() + nodes[1].getActivation()) | 0) % 2;\n };\n\n }\n}\n\n\nexport class AvgLevel extends Level {\n constructor() {\n const omega1 = 1 + Math.random();\n const omega2 = 1 + Math.random();\n const omega3 = 1 + Math.random();\n\n const nodes = [\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega1 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega2 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n new InputNode(() => 0.5 + 0.5 * Math.sin(omega2 * Date.now() / 1000) * Math.exp(-0.3 * (Date.now() - this.t0) / 1000)),\n\n //new Node(),\n\n new OutputNode()\n ];\n\n\n //output from console\n nodes[0].x = 200;\n nodes[0].y = 300;\n nodes[0].allownegative = true;\n nodes[1].x = 200;\n nodes[1].y = 500;\n nodes[1].allownegative = true;\n nodes[2].x = 200;\n nodes[2].y = 700;\n nodes[2].allownegative = true;\n\n nodes[3].x = 800;\n nodes[3].y = 500;\n //nodes[4].x = 800;\n //nodes[4].y = 500;\n\n nodes[0].addChild(nodes[3], 1);\n nodes[1].addChild(nodes[3], 1);\n nodes[2].addChild(nodes[3], 1);\n //nodes[3].addChild(nodes[4], 1);\n\n const nw = new Network(\n nodes,\n [nodes[0], nodes[1], nodes[2]], //input nodes\n [nodes[3]] //output nodes\n );\n const trainXs = [0, 0, 0, 0, 0, 0, 0].map(v => [Math.random(), Math.random(), Math.random()]);\n const trainYs = trainXs.map(p => [(p[0] + p[1] + p[2]) / 3]);\n\n super(\"Berechne den Durchschnitt der Inputwerte!\",\n nw,\n [\"Nummer 1\", \"Nummer 2\", \"Nummer 3\"], trainXs, //temperatures are internally divided by 10.\n [\"Durchschnitt\"], trainYs,\n \"Es gibt drei Inputs. Stelle die Gewichte so ein, dass der Output der Durchschnitt der drei Inputwerte ist. Insbesondere für die Inputwerte in der Tabelle unten soll das Netz korrekte Outputs produzieren.\"\n );\n this.animatestep = function() {\n nodes[3].target = (nodes[0].getActivation() + nodes[1].getActivation() + nodes[2].getActivation()) / 3;\n };\n\n }\n}\n","import {\n LevelController\n} from './LevelController.js';\n\n\nnew LevelController();\n\n\n\nwindow.addEventListener('DOMContentLoaded', (event) => {\n document.querySelector(\"#helpmebutton\").onclick = () => {\n document.querySelector(\".helper\").classList.add(\"visible\");\n document.querySelector(\".mission\").classList.remove(\"visible\");\n document.querySelector(\"#helpmebutton\").classList.add(\"selected\");\n document.querySelector(\"#missionbutton\").classList.remove(\"selected\");\n };\n \n document.querySelector(\"#missionbutton\").onclick = () => {\n document.querySelector(\".helper\").classList.remove(\"visible\");\n document.querySelector(\".mission\").classList.add(\"visible\");\n document.querySelector(\"#helpmebutton\").classList.remove(\"selected\");\n document.querySelector(\"#missionbutton\").classList.add(\"selected\");\n };\n/* FIXME: There is no #creditsbutton id, so why is this code here if it breaks anyway?\n document.querySelector(\"#creditsbutton\").onclick = () => {\n document.querySelector(\".credits\").classList.toggle(\"visible\");\n document.querySelector(\"#screenoverlay\").classList.toggle(\"visible\");\n document.querySelector(\"#creditsbutton\").classList.toggle(\"selected\");\n };\n*/\n document.querySelector(\"#screenoverlay\").onclick = () => {\n document.querySelector(\".credits\").classList.remove(\"visible\");\n document.querySelector(\"#screenoverlay\").classList.remove(\"visible\");\n document.querySelector(\"#creditsbutton\").classList.remove(\"selected\");\n };\n});\n"]}