chart = {
var indices = test_sentence.split(" ").map((d) => lang[d]).filter((d) => d != null),
x_seq = math.matrix(indices.map((d) => embeddings[d])),
model_data = cell_seq(f_stack, x_seq, [math.zeros(64)]),
plot_data = flatten(model_data),
plot_x = reshape_embeddings(x_seq);
var scales = generate_scales(indices);
const svg = d3.select(DOM.svg(width, height));
svg.selectAll("g")
.data(["h", "x", "z", "r", "text"]).enter()
.append("g")
.attr("id", (d) => d);
svg.select("#h")
.selectAll("rect")
.data(plot_data["h"], (d) => d["time"] + "_" + d["coord"]).enter()
.append("rect")
.attrs({
"x": (d) => scales.hx(d.time),
"y": (d) => scales.hy(d.coord),
"fill": (d) => scales.fill(d.value),
"fill-opacity": 0.8,
"width": (scales.hx(1) - scales.hx(0)) * 1.01,
"height": (scales.hy(1) - scales.hy(0)) * 1.01
})
.on("mouseover", (d) => update_focus(svg, d, scales))
.on("mouseout", () => mouseout_fun(svg));
svg.select("#z")
.selectAll("rect")
.data(plot_data["z"], (d) => d["time"] + "_" + d["coord"]).enter()
.append("rect")
.attrs({
"x": (d) => scales.zx(d.time),
"y": (d) => scales.zy(d.coord),
"fill": (d) => scales.sigmoid_fill(d.value),
"width": scales.zx(1) - scales.zx(0),
"height": (scales.hy(1) - scales.hy(0))
});
svg.select("#r")
.selectAll("rect")
.data(plot_data["r"], (d) => d["time"] + "_" + d["coord"]).enter()
.append("rect")
.attrs({
"x": (d) => scales.zx(d.time),
"y": (d) => scales.ry(d.coord),
"fill": (d) => scales.sigmoid_fill(d.value),
"width": scales.zx(1) - scales.zx(0),
"height": scales.hy(1) - scales.hy(0)
});
svg.select("#x")
.selectAll("rect")
.data(plot_x).enter()
.append("rect")
.attrs({
"x": (d) => scales.hx(d.time),
"y": (d) => scales.xy(d.coord),
"fill": (d) => scales.x_fill(d.value),
"width": scales.hx(1) - scales.hx(0),
"height": scales.xy(1) - scales.xy(0)
});
svg.select("#text")
.selectAll("text")
.data(test_sentence.split(" ").filter((d) => d != null)).enter()
.append("text")
.attrs({
"x": (d, i) => scales.hx(i),
"y": .95 * height
})
.text((d) => d);
return svg.node();
}