MNV-beam_search / plotsjs.js
Gabriela Nicole Gonzalez Saez
topk
e4bccbf
async () => {
// set testFn() function on globalThis, so you html onlclick can access it
globalThis.testFn = () => {
document.getElementById('demo').innerHTML = "Hello?"
};
const d3 = await import("https://cdn.jsdelivr.net/npm/d3@7/+esm");
globalThis.d3 = d3;
globalThis.d3Fn = () => {
d3.select('#viz').append('svg')
.append('rect')
.attr('width', 50)
.attr('height', 50)
.attr('fill', 'black')
.on('mouseover', function(){d3.select(this).attr('fill', 'red')})
.on('mouseout', function(){d3.select(this).attr('fill', 'black')});
};
globalThis.testFn_out = (val,radio_c) => {
// document.getElementById('demo').innerHTML = val
console.log(val);
// globalThis.d3Fn();
return([val,radio_c]);
};
// Is this function well commented???
// globalThis.testFn_out_json = (val) => {
// document.getElementById('demo2').innerHTML = JSON.stringify(val);
// console.log(val);
// globalThis.d3Fn();
// return(['string', {}])
// // return(JSON.stringify(val), JSON.stringify(val) );
// };
globalThis.testFn_out_json = (data) => {
console.log(data);
data_beam = data[0];
data_probs = data[1];
const idMapping = data_beam.reduce((acc, el, i) => {
acc[el.id] = i;
return acc;
}, {});
let root;
data_beam.forEach(el => {
// Handle the root element
if (el.parentId === null) {
root = el;
return;
}
// Use our mapping to locate the parent element in our data_beam array
const parentEl = data_beam[idMapping[el.parentId]];
// Add our current el to its parent's `children` array
parentEl.children = [...(parentEl.children || []), el];
});
// console.log(Tree(root));
// document.getElementById('d3_beam_search').innerHTML = Tree(root)
d3.select('#d3_beam_search').html("");
d3.select('#d3_beam_search').append(function(){return Tree(root);});
//probabilities;
//
d3.select('#d3_text_grid').html("");
d3.select('#d3_text_grid').append(function(){return TextGrid(data_probs);});
// $('#d3_text_grid').html(TextGrid(data)) ;
// $('#d3_beam_search').html(Tree(root)) ;
return(['string', {}])
}
// Copyright 2021 Observable, Inc.
// Released under the ISC license.
// https://observablehq.com/@d3/tree
function Tree(data, { // data is either tabular (array of objects) or hierarchy (nested objects)
path, // as an alternative to id and parentId, returns an array identifier, imputing internal nodes
id = Array.isArray(data) ? d => d.id : null, // if tabular data, given a d in data, returns a unique identifier (string)
parentId = Array.isArray(data) ? d => d.parentId : null, // if tabular data, given a node d, returns its parent’s identifier
children, // if hierarchical data, given a d in data, returns its children
tree = d3.tree, // layout algorithm (typically d3.tree or d3.cluster)
sort, // how to sort nodes prior to layout (e.g., (a, b) => d3.descending(a.height, b.height))
label = d => d.name, // given a node d, returns the display name
title = d => d.name, // given a node d, returns its hover text
link , // given a node d, its link (if any)
linkTarget = "_blank", // the target attribute for links (if any)
width = 800, // outer width, in pixels
height, // outer height, in pixels
r = 3, // radius of nodes
padding = 1, // horizontal padding for first and last column
fill = "#999", // fill for nodes
fillOpacity, // fill opacity for nodes
stroke = "#555", // stroke for links
strokeWidth = 2, // stroke width for links
strokeOpacity = 0.4, // stroke opacity for links
strokeLinejoin, // stroke line join for links
strokeLinecap, // stroke line cap for links
halo = "#fff", // color of label halo
haloWidth = 3, // padding around the labels
curve = d3.curveBumpX, // curve for the link
} = {}) {
// If id and parentId options are specified, or the path option, use d3.stratify
// to convert tabular data to a hierarchy; otherwise we assume that the data is
// specified as an object {children} with nested objects (a.k.a. the “flare.json”
// format), and use d3.hierarchy.
const root = path != null ? d3.stratify().path(path)(data)
: id != null || parentId != null ? d3.stratify().id(id).parentId(parentId)(data)
: d3.hierarchy(data, children);
// Sort the nodes.
if (sort != null) root.sort(sort);
// Compute labels and titles.
const descendants = root.descendants();
const L = label == null ? null : descendants.map(d => label(d.data, d));
// Compute the layout.
const descWidth = 10;
// console.log('descendants', descendants);
const realWidth = descWidth * descendants.length
const totalWidth = (realWidth > width) ? realWidth : width;
const dx = 25;
const dy = totalWidth / (root.height + padding);
tree().nodeSize([dx, dy])(root);
// Center the tree.
let x0 = Infinity;
let x1 = -x0;
root.each(d => {
if (d.x > x1) x1 = d.x;
if (d.x < x0) x0 = d.x;
});
// Compute the default height.
if (height === undefined) height = x1 - x0 + dx * 2;
// Use the required curve
if (typeof curve !== "function") throw new Error(`Unsupported curve`);
const parent = d3.create("div");
const body = parent.append("div")
.style("overflow-x", "scroll")
.style("-webkit-overflow-scrolling", "touch");
const svg = body.append("svg")
.attr("viewBox", [-dy * padding / 2, x0 - dx, totalWidth, height])
.attr("width", totalWidth)
.attr("height", height)
.attr("style", "max-width: 100%; height: auto; height: intrinsic;")
.attr("font-family", "sans-serif")
.attr("font-size", 12);
svg.append("g")
.attr("fill", "none")
.attr("stroke", stroke)
.attr("stroke-opacity", strokeOpacity)
.attr("stroke-linecap", strokeLinecap)
.attr("stroke-linejoin", strokeLinejoin)
.attr("stroke-width", strokeWidth)
.selectAll("path")
.data(root.links())
.join("path")
// .attr("stroke", d => d.prob > 0.5 ? 'red' : 'blue' )
// .attr("fill", "red")
.attr("d", d3.link(curve)
.x(d => d.y)
.y(d => d.x));
const node = svg.append("g")
.selectAll("a")
.data(root.descendants())
.join("a")
.attr("xlink:href", link == null ? null : d => link(d.data, d))
.attr("target", link == null ? null : linkTarget)
.attr("transform", d => `translate(${d.y},${d.x})`);
node.append("circle")
.attr("fill", d => d.children ? stroke : fill)
.attr("r", r);
title = d => (d.name + ( d.prob));
if (title != null) node.append("title")
.text(d => title(d.data, d));
if (L) node.append("text")
.attr("dy", "0.32em")
.attr("x", d => d.children ? -6 : 6)
.attr("text-anchor", d => d.children ? "end" : "start")
.attr("paint-order", "stroke")
.attr("stroke", 'white')
.attr("fill", d => d.data.prob == 1 ? ('red') : ('black') )
.attr("stroke-width", haloWidth)
.text((d, i) => L[i]);
body.node().scrollBy(totalWidth, 0);
return svg.node();
}
function TextGrid(data, div_name, {
width = 640, // outer width, in pixels
height , // outer height, in pixels
r = 3, // radius of nodes
padding = 1, // horizontal padding for first and last column
// text = d => d[2],
} = {}){
// console.log("TextGrid", data);
// Compute the layout.
const dx = 10;
const dy = 10; //width / (root.height + padding);
const marginTop = 20;
const marginRight = 20;
const marginBottom = 30;
const marginLeft = 30;
// Center the tree.
let x0 = Infinity;
let x1 = -x0;
topk = 10;
word_length = 20;
const rectWidth = 60;
const rectTotal = 70;
wval = 0
const realWidth = rectTotal * data.length
const totalWidth = (realWidth > width) ? realWidth : width;
// root.each(d => {
// if (d.x > x1) x1 = d.x;
// if (d.x < x0) x0 = d.x;
// });
// Compute the default height.
// if (height === undefined) height = x1 - x0 + dx * 2;
if (height === undefined) height = topk * word_length + 10;
const parent = d3.create("div");
// parent.append("svg")
// .attr("width", width)
// .attr("height", height)
// .style("position", "absolute")
// .style("pointer-events", "none")
// .style("z-index", 1);
// const svg = d3.create("svg")
// // svg = parent.append("svg")
// .attr("viewBox", [-dy * padding / 2, x0 - dx, width, height])
// .attr("width", width)
// .attr("height", height)
// .attr("style", "max-width: 100%; height: auto; height: intrinsic;")
// .attr("font-family", "sans-serif")
// .attr("font-size", 10);
// div.data([1, 2, 4, 8, 16, 32], d => d);
// div.enter().append("div").text(d => d);
const body = parent.append("div")
.style("overflow-x", "scroll")
.style("-webkit-overflow-scrolling", "touch");
const svg = body.append("svg")
.attr("width", totalWidth)
.attr("height", height)
.style("display", "block")
.attr("font-family", "sans-serif")
.attr("font-size", 10);
data.forEach(words_list => {
// console.log(wval, words_list);
words = words_list[2]; // {'t': words_list[2], 'p': words_list[1]};
scores = words_list[1];
words_score = words.map( (x,i) => {return {t: x, p: scores[i]}})
// console.log(words_score);
// svg.selectAll("text").enter()
// .data(words)
// .join("text")
// .text((d,i) => (d))
// .attr("x", wval)
// .attr("y", ((d,i) => (20 + i*20)))
var probs = svg.selectAll("text").enter()
.data(words_score).join('g');
probs.append("rect")
// .data(words)
.attr("x", wval)
.attr("y", ((d,i) => ( 10+ i*20)))
.attr('width', rectWidth)
.attr('height', 15)
.attr("color", 'gray')
.attr("fill", "gray")
// .attr("fill-opacity", "0.2")
.attr("fill-opacity", (d) => (d.p))
.attr("stroke-opacity", 0.8)
.append("svg:title")
.text(function(d){return d.t+":"+d.p;});
probs.append("text")
// .data(words)
.text((d,i) => (d.t))
.attr("x", wval)
.attr("y", ((d,i) => (20 + i*20)))
// .attr("fill", 'white')
.attr("font-weight", 700);
wval = wval + rectTotal;
});
body.node().scrollBy(totalWidth, 0);
// return svg.node();
return parent.node();
}
}
// define('viz', ['d3'], function (d3) {
// function draw(container) {
// d3.select(container).append("svg").append('rect').attr('id', 'viz_rect').attr('width', 50).attr('height', 50);
// }
// return draw;
// });
// console.log("HERE!")
// element.append('Loaded 😄 ');
// variable2='hello';
// draw('.gradio-container')
// function transform_beamsearch(data){
// const idMapping = data.reduce((acc, el, i) => {
// acc[el.id] = i;
// return acc;
// }, {});
// let root;
// data.forEach(el => {
// // Handle the root element
// if (el.parentId === null) {
// root = el;
// return;
// }
// // Use our mapping to locate the parent element in our data array
// const parentEl = data[idMapping[el.parentId]];
// // Add our current el to its parent's `children` array
// parentEl.children = [...(parentEl.children || []), el];
// });
// // console.log(Tree(root, { label: d => d.name,}));
// console.log(root);
// // $('#d3_beam_search').html(Tree(root)) ;
// return root;
// }
// var gradioContainer = document.querySelector('.gradio-container');
// gradioContainer.insertBefore(container, gradioContainer.firstChild);