!function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o0;)index=Math.floor(Math.random()*counter),counter--,temp=array[counter],array[counter]=array[index],array[index]=temp}function classifyTwoGaussData(numSamples,noise){function genGauss(cx,cy,label){for(var i=0;iMath.abs(label)&&(label=newLabel)}),label}for(var points=[],labelScale=d3.scale.linear().domain([0,2]).range([1,0]).clamp(!0),gaussians=[[-4,2.5,1],[0,2.5,-1],[4,2.5,1],[-4,-2.5,-1],[0,-2.5,1],[4,-2.5,-1]],i=0;i=0?1:-1}for(var points=[],i=0;i0?.3:-.3;var y=randUniform(-5,5);y+=y>0?.3:-.3;var noiseX=randUniform(-5,5)*noise,noiseY=randUniform(-5,5)*noise,label=getXORLabel({x:x+noiseX,y:y+noiseY});points.push({x:x,y:y,label:label})}return points}function randUniform(a,b){return Math.random()*(b-a)+a}function normalRandom(mean,variance){void 0===mean&&(mean=0),void 0===variance&&(variance=1);var v1,v2,s;do v1=2*Math.random()-1,v2=2*Math.random()-1,s=v1*v1+v2*v2;while(s>1);var result=Math.sqrt(-2*Math.log(s)/s)*v1;return mean+Math.sqrt(variance)*result}function dist(a,b){var dx=a.x-b.x,dy=a.y-b.y;return Math.sqrt(dx*dx+dy*dy)}exports.shuffle=shuffle,exports.classifyTwoGaussData=classifyTwoGaussData,exports.regressPlane=regressPlane,exports.regressGaussian=regressGaussian,exports.classifySpiralData=classifySpiralData,exports.classifyCircleData=classifyCircleData,exports.classifyXORData=classifyXORData},{}],2:[function(require,module,exports){"use strict";function reduceMatrix(matrix,factor){if(matrix.length!==matrix[0].length)throw new Error("The provided matrix must be a square matrix");if(matrix.length%factor!=0)throw new Error("The width/height of the matrix must be divisible by the reduction factor");for(var result=new Array(matrix.length/factor),i=0;i=0?1:-1);var c=d3.rgb(this.color(value));image.data[++p]=c.r,image.data[++p]=c.g,image.data[++p]=c.b,image.data[++p]=160}context.putImageData(image,0,0)},HeatMap.prototype.updateCircles=function(container,points){var _this=this,xDomain=this.xScale.domain(),yDomain=this.yScale.domain();points=points.filter(function(p){return p.x>=xDomain[0]&&p.x<=xDomain[1]&&p.y>=yDomain[0]&&p.y<=yDomain[1]});var selection=container.selectAll("circle").data(points);selection.enter().append("circle").attr("r",3),selection.attr({cx:function(d){return _this.xScale(d.x)},cy:function(d){return _this.yScale(d.y)}}).style("fill",function(d){return _this.color(d.label)}),selection.exit().remove()},HeatMap}();exports.HeatMap=HeatMap,exports.reduceMatrix=reduceMatrix},{}],3:[function(require,module,exports){"use strict";var AppendingLineChart=function(){function AppendingLineChart(container,lineColors){this.data=[],this.minY=Number.MAX_VALUE,this.maxY=Number.MIN_VALUE,this.lineColors=lineColors,this.numLines=lineColors.length;var node=container.node(),totalWidth=node.offsetWidth,totalHeight=node.offsetHeight,margin={top:2,right:0,bottom:2,left:2},width=totalWidth-margin.left-margin.right,height=totalHeight-margin.top-margin.bottom;this.xScale=d3.scale.linear().domain([0,0]).range([0,width]),this.yScale=d3.scale.linear().domain([0,0]).range([height,0]),this.svg=container.append("svg").attr("width",width+margin.left+margin.right).attr("height",height+margin.top+margin.bottom).append("g").attr("transform","translate("+margin.left+","+margin.top+")"),this.paths=new Array(this.numLines);for(var i=0;i=1)for(var j=0;j=1;layerIdx--){for(var currentLayer=network[layerIdx],i=0;i0&&(node.bias-=learningRate*node.accInputDer/node.numAccumulatedDers,node.accInputDer=0,node.numAccumulatedDers=0);for(var j=0;j0){link.weight=link.weight-learningRate/link.numAccumulatedDers*link.accErrorDer;var newLinkWeight=link.weight-learningRate*regularizationRate*regulDer;link.regularization===RegularizationFunction.L1&&link.weight*newLinkWeight<0?(link.weight=0,link.isDead=!0):link.weight=newLinkWeight,link.accErrorDer=0,link.numAccumulatedDers=0}}}}}function forEachNode(network,ignoreInputs,accessor){for(var layerIdx=ignoreInputs?1:0;layerIdx0?1:0}},RegularizationFunction.L2={output:function(w){return.5*w*w},der:function(w){return w}},exports.RegularizationFunction=RegularizationFunction;var Link=function(){function Link(source,dest,regularization,initZero){this.weight=Math.random()-.5,this.isDead=!1,this.errorDer=0,this.accErrorDer=0,this.numAccumulatedDers=0,this.id=source.id+"-"+dest.id,this.source=source,this.dest=dest,this.regularization=regularization,initZero&&(this.weight=0)}return Link}();exports.Link=Link,exports.buildNetwork=buildNetwork,exports.forwardProp=forwardProp,exports.backProp=backProp,exports.updateWeights=updateWeights,exports.forEachNode=forEachNode,exports.getOutputNode=getOutputNode},{}],5:[function(require,module,exports){"use strict";function scrollTween(offset){return function(){var i=d3.interpolateNumber(window.pageYOffset||document.documentElement.scrollTop,offset);return function(t){scrollTo(0,i(t))}}}function makeGUI(){d3.select("#reset-button").on("click",function(){reset(),userHasInteracted(),d3.select("#play-pause-button")}),d3.select("#play-pause-button").on("click",function(){userHasInteracted(),player.playOrPause()}),player.onPlayPause(function(isPlaying){d3.select("#play-pause-button").classed("playing",isPlaying)}),d3.select("#next-step-button").on("click",function(){player.pause(),userHasInteracted(),0===iter&&simulationStarted(),oneStep()}),d3.select("#data-regen-button").on("click",function(){generateData(),parametersChanged=!0});var dataThumbnails=d3.selectAll("canvas[data-dataset]");dataThumbnails.on("click",function(){var newDataset=state_1.datasets[this.dataset.dataset];newDataset!==state.dataset&&(state.dataset=newDataset,dataThumbnails.classed("selected",!1),d3.select(this).classed("selected",!0),generateData(),parametersChanged=!0,reset())});var datasetKey=state_1.getKeyFromValue(state_1.datasets,state.dataset);d3.select("canvas[data-dataset="+datasetKey+"]").classed("selected",!0);var regDataThumbnails=d3.selectAll("canvas[data-regDataset]");regDataThumbnails.on("click",function(){var newDataset=state_1.regDatasets[this.dataset.regdataset];newDataset!==state.regDataset&&(state.regDataset=newDataset,regDataThumbnails.classed("selected",!1),d3.select(this).classed("selected",!0),generateData(),parametersChanged=!0,reset())});var regDatasetKey=state_1.getKeyFromValue(state_1.regDatasets,state.regDataset);d3.select("canvas[data-regDataset="+regDatasetKey+"]").classed("selected",!0),d3.select("#add-layers").on("click",function(){state.numHiddenLayers>=6||(state.networkShape[state.numHiddenLayers]=2,state.numHiddenLayers++,parametersChanged=!0,reset())}),d3.select("#remove-layers").on("click",function(){state.numHiddenLayers<=0||(state.numHiddenLayers--,state.networkShape.splice(state.numHiddenLayers),parametersChanged=!0,reset())}),d3.select("#show-test-data").on("change",function(){state.showTestData=this.checked,state.serialize(),userHasInteracted(),heatMap.updateTestPoints(state.showTestData?testData:[])}).property("checked",state.showTestData),d3.select("#discretize").on("change",function(){state.discretize=this.checked,state.serialize(),userHasInteracted(),updateUI()}).property("checked",state.discretize),d3.select("#percTrainData").on("input",function(){state.percTrainData=this.value,d3.select("label[for='percTrainData'] .value").text(this.value),generateData(),parametersChanged=!0,reset()}).property("value",state.percTrainData),d3.select("label[for='percTrainData'] .value").text(state.percTrainData),d3.select("#noise").on("input",function(){state.noise=this.value,d3.select("label[for='noise'] .value").text(this.value),generateData(),parametersChanged=!0,reset()}).property("value",state.noise),d3.select("label[for='noise'] .value").text(state.noise),d3.select("#batchSize").on("input",function(){state.batchSize=this.value,d3.select("label[for='batchSize'] .value").text(this.value),parametersChanged=!0,reset()}).property("value",state.batchSize),d3.select("label[for='batchSize'] .value").text(state.batchSize),d3.select("#activations").on("change",function(){state.activation=state_1.activations[this.value],parametersChanged=!0,reset()}).property("value",state_1.getKeyFromValue(state_1.activations,state.activation)),d3.select("#learningRate").on("change",function(){state.learningRate=+this.value,state.serialize(),userHasInteracted(),parametersChanged=!0}).property("value",state.learningRate),d3.select("#regularizations").on("change",function(){state.regularization=state_1.regularizations[this.value],parametersChanged=!0,reset()}).property("value",state_1.getKeyFromValue(state_1.regularizations,state.regularization)),d3.select("#regularRate").on("change",function(){state.regularizationRate=+this.value,parametersChanged=!0,reset()}).property("value",state.regularizationRate),d3.select("#problem").on("change",function(){state.problem=state_1.problems[this.value],generateData(),drawDatasetThumbnails(),parametersChanged=!0,reset()}).property("value",state_1.getKeyFromValue(state_1.problems,state.problem));var x=d3.scale.linear().domain([-1,1]).range([0,144]),xAxis=d3.svg.axis().scale(x).orient("bottom").tickValues([-1,0,1]).tickFormat(d3.format("d"));d3.select("#colormap g.core").append("g").attr("class","x axis").attr("transform","translate(0,10)").call(xAxis),window.addEventListener("resize",function(){var newWidth=document.querySelector("#main-part").getBoundingClientRect().width;newWidth!==mainWidth&&(mainWidth=newWidth,drawNetwork(network),updateUI(!0))}),state.hideText&&(d3.select("#article-text").style("display","none"),d3.select("div.more").style("display","none"),d3.select("header").style("display","none"))}function updateBiasesUI(network){nn.forEachNode(network,!0,function(node){d3.select("rect#bias-"+node.id).style("fill",colorScale(node.bias))})}function updateWeightsUI(network,container){for(var layerIdx=1;layerIdx=numNodes_1){var midPoint=path.getPointAtLength(.7*path.getTotalLength());calloutWeights.style({display:null,top:midPoint.y+5+"px",left:midPoint.x+3+"px"}),targetIdWithCallout=link.dest.id}}}}cx=width+15;var node=network[numLayers-1][0],cy=nodeIndexScale(0)+15;node2coord[node.id]={cx:cx,cy:cy};for(var i=0;i=8||(state.networkShape[i]++,parametersChanged=!0,reset())}).append("i").attr("class","material-icons").text("add"),firstRow.append("button").attr("class","mdl-button mdl-js-button mdl-button--icon").on("click",function(){state.networkShape[i]<=1||(state.networkShape[i]--,parametersChanged=!0,reset())}).append("i").attr("class","material-icons").text("remove");var suffix=state.networkShape[i]>1?"s":"";div.append("div").text(state.networkShape[i]+" neuron"+suffix)}function updateHoverCard(type,nodeOrLink,coordinates){var hovercard=d3.select("#hovercard");if(null==type)return hovercard.style("display","none"),void d3.select("#svg").on("click",null);d3.select("#svg").on("click",function(){hovercard.select(".value").style("display","none");var input=hovercard.select("input");input.style("display",null),input.on("input",function(){null!=this.value&&""!==this.value&&(type===HoverType.WEIGHT?nodeOrLink.weight=+this.value:nodeOrLink.bias=+this.value,updateUI())}),input.on("keypress",function(){13===d3.event.keyCode&&updateHoverCard(type,nodeOrLink,coordinates)}),input.node().focus()});var value=type===HoverType.WEIGHT?nodeOrLink.weight:nodeOrLink.bias,name=type===HoverType.WEIGHT?"Weight":"Bias";hovercard.style({left:coordinates[0]+20+"px",top:coordinates[1]+"px",display:"block"}),hovercard.select(".type").text(name),hovercard.select(".value").style("display",null).text(value.toPrecision(2)),hovercard.select("input").property("value",value.toPrecision(2)).style("display","none")}function drawLink(input,node2coord,network,container,isFirst,index,length){var line=container.insert("path",":first-child"),source=node2coord[input.source.id],dest=node2coord[input.dest.id],datum={source:{y:source.cx+15+2,x:source.cy},target:{y:dest.cx-15,x:dest.cy+(index-(length-1)/2)/length*12}},diagonal=d3.svg.diagonal().projection(function(d){return[d.y,d.x]});return line.attr({"marker-start":"url(#markerArrow)",class:"link",id:"link"+input.source.id+"-"+input.dest.id,d:diagonal(datum,0)}),container.append("path").attr("d",diagonal(datum,0)).attr("class","link-hover").on("mouseenter",function(){updateHoverCard(HoverType.WEIGHT,input,d3.mouse(this))}).on("mouseleave",function(){updateHoverCard(null)}),line}function updateDecisionBoundary(network,firstTime){if(firstTime){boundary={},nn.forEachNode(network,!0,function(node){boundary[node.id]=new Array(100)});for(var nodeId in INPUTS)boundary[nodeId]=new Array(100)}var xScale=d3.scale.linear().domain([0,99]).range(xDomain),yScale=d3.scale.linear().domain([99,0]).range(xDomain),i=0,j=0;for(i=0;i<100;i++){if(firstTime){nn.forEachNode(network,!0,function(node){boundary[node.id][i]=new Array(100)});for(var nodeId in INPUTS)boundary[nodeId][i]=new Array(100)}for(j=0;j<100;j++){var x=xScale(i),y=yScale(j),input=constructInput(x,y);if(nn.forwardProp(network,input),nn.forEachNode(network,!0,function(node){boundary[node.id][i][j]=node.output}),firstTime)for(var nodeId in INPUTS)boundary[nodeId][i][j]=INPUTS[nodeId].f(x,y)}}}function getLoss(network,dataPoints){for(var loss=0,i=0;i