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