{"version":3,"sources":["notes/20200515000814-d3/20200618132104.static.mjs"],"names":["jsdom","d3","math","MultivariateNormal","fs","width","height","margin","left","top","right","bottom","mvn","x","μ","Σ","k","length","norm","sqrt","pi","abs","diff","subtract","exp","multiply","transpose","inv","async","graph","m","default","sample","s","y","p","extent","scaleLinear","domain","range","nice","svg","select","JSDOM","window","document","body","append","attr","style","gx","text","call","axisBottom","gy","axisLeft","i","console","log","interpolateRdYlBu","writeFile","node","outerHTML"],"mappings":"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","file":"20200618132104.static.mjs","sourcesContent":["#!/usr/bin/node\n\nimport jsdom from \"jsdom\"\nimport d3 from \"d3\"\nimport math from \"mathjs\"\nimport MultivariateNormal from \"multivariate-normal\"\nimport {\n\tpromises as fs\n} from \"fs\"\n\nconst width = 680,\n\theight = 480,\n\tmargin = {\n\t\tleft: 50,\n\t\ttop: 10,\n\t\tright: 50,\n\t\tbottom: 40\n\t}\n\nfunction mvn(x, μ, Σ) {\n\tlet k = x.length\n\tlet norm = math.sqrt((2 * math.pi) ^ k * math.abs(Σ))\n\tlet diff = math.subtract(x, μ)\n\tlet exp = math.exp(-0.5 * math.multiply(math.transpose(diff), math.inv(Σ), diff))\n\n\treturn exp / norm\n}\n\nasync function graph() {\n\n\t// Define the data\n\n\tlet m = new MultivariateNormal.default([0, 0], [\n\t\t[1, 0],\n\t\t[0, 1]\n\t])\n\n\tfunction sample() {\n\t\tlet s = m.sample()\n\t\treturn {\n\t\t\tx: s[0],\n\t\t\ty: s[1],\n\t\t\tp: mvn(s, [0, 0], [\n\t\t\t\t[1, 0],\n\t\t\t\t[0, 1]\n\t\t\t])\n\t\t}\n\t}\n\n\t// Create empty graph\n\n\tlet extent = [-3, 3]\n\tlet x = d3.scaleLinear()\n\t\t.domain(extent)\n\t\t.range([margin.left, width - margin.right])\n\t\t.nice()\n\n\tlet y = d3.scaleLinear()\n\t\t.domain(extent)\n\t\t.range([height - margin.bottom, margin.top])\n\t\t.nice()\n\n\tlet svg = d3.select(new jsdom.JSDOM().window.document.body)\n\t\t.append(\"svg\")\n\t\t.attr('xmlns', 'http://www.w3.org/2000/svg')\n\t\t.style(\"user-select\", \"none\")\n\t\t.style(\"font-family\", \"sans-serif\")\n\t\t.attr(\"viewBox\", [0, 0, width, height])\n\n\t// x axis\n\n\tlet gx = svg.append(\"g\")\n\t\t.attr(\"transform\", `translate(0,${height - margin.bottom})`)\n\n\tgx.append(\"g\")\n\t\t.append(\"text\")\n\t\t.attr(\"x\", (width + margin.left - margin.right) / 2)\n\t\t.attr(\"y\", margin.bottom - 4)\n\t\t.attr(\"text-anchor\", \"middle\")\n\t\t.style(\"font-size\", \"16px\")\n\t\t.style(\"fill\", \"currentColor\")\n\t\t.text(\"x\")\n\n\tlet xaxis = gx.append(\"g\")\n\t\t.call(d3.axisBottom(x))\n\n\t// y axis\n\n\tlet gy = svg.append(\"g\")\n\t\t.attr(\"transform\", `translate(${margin.left},0)`)\n\n\tgy.append(\"g\")\n\t\t.append(\"text\")\n\t\t.attr(\"y\", -margin.left + 16)\n\t\t.attr(\"x\", (-height + margin.bottom - margin.top) / 2)\n\t\t.attr(\"text-anchor\", \"middle\")\n\t\t.attr(\"transform\", \"rotate(-90)\")\n\t\t.style(\"font-size\", \"16px\")\n\t\t.style(\"fill\", \"currentColor\")\n\t\t.text(\"y\");\n\n\tlet yaxis = gy.append(\"g\")\n\t\t.call(d3.axisLeft(y))\n\n\t// Add a clip path\n\n\tsvg.append(\"clipPath\")\n\t\t.attr(\"id\", \"clip\")\n\t\t.append(\"rect\")\n\t\t.attr(\"x\", margin.left + 2)\n\t\t.attr(\"y\", margin.top + 2)\n\t\t.attr(\"width\", width - margin.left - margin.right - 4)\n\t\t.attr(\"height\", height - margin.top - margin.bottom - 4);\n\n\t// Draw graph\n\n\tlet graph = svg.append(\"g\")\n\t\t.attr(\"clip-path\", \"url(#clip)\")\n\n\tfor (var i = 0; i < 100; i++) {\n\t\tlet s = sample()\n\t\tconsole.log(s)\n\t\tgraph.append(\"circle\")\n\t\t\t.attr(\"r\", 3)\n\t\t\t.attr(\"transform\", `translate(${x(s.x)}, ${y(s.y)})`)\n\t\t\t.attr(\"fill\", d3.interpolateRdYlBu(s.p))\n\t}\n\n\n\t// Save svg\n\tfs.writeFile(\"scatter.svg\", svg.node().outerHTML)\n}\n\ngraph()\n"]}