Spaces:
Sleeping
Sleeping
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); | |