in src/playground.ts [178:395]
function makeGUI() {
d3.select("#reset-button").on("click", () => {
reset();
userHasInteracted();
d3.select("#play-pause-button");
});
d3.select("#play-pause-button").on("click", function () {
// Change the button's content.
userHasInteracted();
player.playOrPause();
});
player.onPlayPause(isPlaying => {
d3.select("#play-pause-button").classed("playing", isPlaying);
});
d3.select("#next-step-button").on("click", () => {
player.pause();
userHasInteracted();
if (iter === 0) {
simulationStarted();
}
oneStep();
});
d3.select("#data-regen-button").on("click", () => {
generateData();
parametersChanged = true;
});
let dataThumbnails = d3.selectAll("canvas[data-dataset]");
dataThumbnails.on("click", function() {
let newDataset = datasets[this.dataset.dataset];
if (newDataset === state.dataset) {
return; // No-op.
}
state.dataset = newDataset;
dataThumbnails.classed("selected", false);
d3.select(this).classed("selected", true);
generateData();
parametersChanged = true;
reset();
});
let datasetKey = getKeyFromValue(datasets, state.dataset);
// Select the dataset according to the current state.
d3.select(`canvas[data-dataset=${datasetKey}]`)
.classed("selected", true);
let regDataThumbnails = d3.selectAll("canvas[data-regDataset]");
regDataThumbnails.on("click", function() {
let newDataset = regDatasets[this.dataset.regdataset];
if (newDataset === state.regDataset) {
return; // No-op.
}
state.regDataset = newDataset;
regDataThumbnails.classed("selected", false);
d3.select(this).classed("selected", true);
generateData();
parametersChanged = true;
reset();
});
let regDatasetKey = getKeyFromValue(regDatasets, state.regDataset);
// Select the dataset according to the current state.
d3.select(`canvas[data-regDataset=${regDatasetKey}]`)
.classed("selected", true);
d3.select("#add-layers").on("click", () => {
if (state.numHiddenLayers >= 6) {
return;
}
state.networkShape[state.numHiddenLayers] = 2;
state.numHiddenLayers++;
parametersChanged = true;
reset();
});
d3.select("#remove-layers").on("click", () => {
if (state.numHiddenLayers <= 0) {
return;
}
state.numHiddenLayers--;
state.networkShape.splice(state.numHiddenLayers);
parametersChanged = true;
reset();
});
let showTestData = d3.select("#show-test-data").on("change", function() {
state.showTestData = this.checked;
state.serialize();
userHasInteracted();
heatMap.updateTestPoints(state.showTestData ? testData : []);
});
// Check/uncheck the checkbox according to the current state.
showTestData.property("checked", state.showTestData);
let discretize = d3.select("#discretize").on("change", function() {
state.discretize = this.checked;
state.serialize();
userHasInteracted();
updateUI();
});
// Check/uncheck the checbox according to the current state.
discretize.property("checked", state.discretize);
let percTrain = d3.select("#percTrainData").on("input", function() {
state.percTrainData = this.value;
d3.select("label[for='percTrainData'] .value").text(this.value);
generateData();
parametersChanged = true;
reset();
});
percTrain.property("value", state.percTrainData);
d3.select("label[for='percTrainData'] .value").text(state.percTrainData);
let noise = d3.select("#noise").on("input", function() {
state.noise = this.value;
d3.select("label[for='noise'] .value").text(this.value);
generateData();
parametersChanged = true;
reset();
});
let currentMax = parseInt(noise.property("max"));
if (state.noise > currentMax) {
if (state.noise <= 80) {
noise.property("max", state.noise);
} else {
state.noise = 50;
}
} else if (state.noise < 0) {
state.noise = 0;
}
noise.property("value", state.noise);
d3.select("label[for='noise'] .value").text(state.noise);
let batchSize = d3.select("#batchSize").on("input", function() {
state.batchSize = this.value;
d3.select("label[for='batchSize'] .value").text(this.value);
parametersChanged = true;
reset();
});
batchSize.property("value", state.batchSize);
d3.select("label[for='batchSize'] .value").text(state.batchSize);
let activationDropdown = d3.select("#activations").on("change", function() {
state.activation = activations[this.value];
parametersChanged = true;
reset();
});
activationDropdown.property("value",
getKeyFromValue(activations, state.activation));
let learningRate = d3.select("#learningRate").on("change", function() {
state.learningRate = +this.value;
state.serialize();
userHasInteracted();
parametersChanged = true;
});
learningRate.property("value", state.learningRate);
let regularDropdown = d3.select("#regularizations").on("change",
function() {
state.regularization = regularizations[this.value];
parametersChanged = true;
reset();
});
regularDropdown.property("value",
getKeyFromValue(regularizations, state.regularization));
let regularRate = d3.select("#regularRate").on("change", function() {
state.regularizationRate = +this.value;
parametersChanged = true;
reset();
});
regularRate.property("value", state.regularizationRate);
let problem = d3.select("#problem").on("change", function() {
state.problem = problems[this.value];
generateData();
drawDatasetThumbnails();
parametersChanged = true;
reset();
});
problem.property("value", getKeyFromValue(problems, state.problem));
// Add scale to the gradient color map.
let x = d3.scale.linear().domain([-1, 1]).range([0, 144]);
let 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);
// Listen for css-responsive changes and redraw the svg network.
window.addEventListener("resize", () => {
let newWidth = document.querySelector("#main-part")
.getBoundingClientRect().width;
if (newWidth !== mainWidth) {
mainWidth = newWidth;
drawNetwork(network);
updateUI(true);
}
});
// Hide the text below the visualization depending on the URL.
if (state.hideText) {
d3.select("#article-text").style("display", "none");
d3.select("div.more").style("display", "none");
d3.select("header").style("display", "none");
}
}