{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../src/plots/venn/layout/layout.ts"],"names":[],"mappings":"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","sourcesContent":["import { bisect, conjugateGradient, nelderMead, norm2, scale, zeros, zerosM } from 'fmin';\nimport { circleCircleIntersection, circleOverlap, distance, intersectionArea } from './circleintersection';\n\n/** given a list of set objects, and their corresponding overlaps.\nupdates the (x, y, radius) attribute on each set such that their positions\nroughly correspond to the desired overlaps */\nexport function venn(areas, parameters?: any) {\n parameters = parameters || {};\n parameters.maxIterations = parameters.maxIterations || 500;\n const initialLayout = parameters.initialLayout || bestInitialLayout;\n const loss = parameters.lossFunction || lossFunction;\n\n // add in missing pairwise areas as having 0 size\n areas = addMissingAreas(areas);\n\n // initial layout is done greedily\n const circles = initialLayout(areas, parameters);\n\n // transform x/y coordinates to a vector to optimize\n const initial = [],\n setids = [];\n let setid;\n for (setid in circles) {\n // eslint-disable-next-line\n if (circles.hasOwnProperty(setid)) {\n initial.push(circles[setid].x);\n initial.push(circles[setid].y);\n setids.push(setid);\n }\n }\n\n // optimize initial layout from our loss function\n const solution = nelderMead(\n function (values) {\n const current = {};\n for (let i = 0; i < setids.length; ++i) {\n const setid = setids[i];\n current[setid] = {\n x: values[2 * i],\n y: values[2 * i + 1],\n radius: circles[setid].radius,\n // size : circles[setid].size\n };\n }\n return loss(current, areas);\n },\n initial,\n parameters\n );\n\n // transform solution vector back to x/y points\n const positions = solution.x;\n for (let i = 0; i < setids.length; ++i) {\n setid = setids[i];\n circles[setid].x = positions[2 * i];\n circles[setid].y = positions[2 * i + 1];\n }\n\n return circles;\n}\n\nconst SMALL = 1e-10;\n\n/** Returns the distance necessary for two circles of radius r1 + r2 to\nhave the overlap area 'overlap' */\nexport function distanceFromIntersectArea(r1, r2, overlap) {\n // handle complete overlapped circles\n if (Math.min(r1, r2) * Math.min(r1, r2) * Math.PI <= overlap + SMALL) {\n return Math.abs(r1 - r2);\n }\n\n return bisect(\n function (distance) {\n return circleOverlap(r1, r2, distance) - overlap;\n },\n 0,\n r1 + r2\n );\n}\n\n/** Missing pair-wise intersection area data can cause problems:\n treating as an unknown means that sets will be laid out overlapping,\n which isn't what people expect. To reflect that we want disjoint sets\n here, set the overlap to 0 for all missing pairwise set intersections */\nfunction addMissingAreas(areas) {\n areas = areas.slice();\n\n // two circle intersections that aren't defined\n const ids: number[] = [],\n pairs: any = {};\n let i, j, a, b;\n for (i = 0; i < areas.length; ++i) {\n const area = areas[i];\n if (area.sets.length == 1) {\n ids.push(area.sets[0]);\n } else if (area.sets.length == 2) {\n a = area.sets[0];\n b = area.sets[1];\n // @ts-ignore\n pairs[[a, b]] = true;\n // @ts-ignore\n pairs[[b, a]] = true;\n }\n }\n ids.sort((a, b) => {\n return a > b ? 1 : -1;\n });\n\n for (i = 0; i < ids.length; ++i) {\n a = ids[i];\n for (j = i + 1; j < ids.length; ++j) {\n b = ids[j];\n // @ts-ignore\n if (!([a, b] in pairs)) {\n areas.push({ sets: [a, b], size: 0 });\n }\n }\n }\n return areas;\n}\n\n/// Returns two matrices, one of the euclidean distances between the sets\n/// and the other indicating if there are subset or disjoint set relationships\nexport function getDistanceMatrices(areas, sets, setids) {\n // initialize an empty distance matrix between all the points\n const distances = zerosM(sets.length, sets.length),\n constraints = zerosM(sets.length, sets.length);\n\n // compute required distances between all the sets such that\n // the areas match\n areas\n .filter(function (x) {\n return x.sets.length == 2;\n })\n .map(function (current) {\n const left = setids[current.sets[0]],\n right = setids[current.sets[1]],\n r1 = Math.sqrt(sets[left].size / Math.PI),\n r2 = Math.sqrt(sets[right].size / Math.PI),\n distance = distanceFromIntersectArea(r1, r2, current.size);\n\n distances[left][right] = distances[right][left] = distance;\n\n // also update constraints to indicate if its a subset or disjoint\n // relationship\n let c = 0;\n if (current.size + 1e-10 >= Math.min(sets[left].size, sets[right].size)) {\n c = 1;\n } else if (current.size <= 1e-10) {\n c = -1;\n }\n constraints[left][right] = constraints[right][left] = c;\n });\n\n return { distances: distances, constraints: constraints };\n}\n\n/// computes the gradient and loss simulatenously for our constrained MDS optimizer\nfunction constrainedMDSGradient(x, fxprime, distances, constraints) {\n let loss = 0,\n i;\n for (i = 0; i < fxprime.length; ++i) {\n fxprime[i] = 0;\n }\n\n for (i = 0; i < distances.length; ++i) {\n const xi = x[2 * i],\n yi = x[2 * i + 1];\n for (let j = i + 1; j < distances.length; ++j) {\n const xj = x[2 * j],\n yj = x[2 * j + 1],\n dij = distances[i][j],\n constraint = constraints[i][j];\n\n const squaredDistance = (xj - xi) * (xj - xi) + (yj - yi) * (yj - yi),\n distance = Math.sqrt(squaredDistance),\n delta = squaredDistance - dij * dij;\n\n if ((constraint > 0 && distance <= dij) || (constraint < 0 && distance >= dij)) {\n continue;\n }\n\n loss += 2 * delta * delta;\n\n fxprime[2 * i] += 4 * delta * (xi - xj);\n fxprime[2 * i + 1] += 4 * delta * (yi - yj);\n\n fxprime[2 * j] += 4 * delta * (xj - xi);\n fxprime[2 * j + 1] += 4 * delta * (yj - yi);\n }\n }\n return loss;\n}\n\n/// takes the best working variant of either constrained MDS or greedy\nexport function bestInitialLayout(areas, params) {\n let initial = greedyLayout(areas, params);\n const loss = params.lossFunction || lossFunction;\n\n // greedylayout is sufficient for all 2/3 circle cases. try out\n // constrained MDS for higher order problems, take its output\n // if it outperforms. (greedy is aesthetically better on 2/3 circles\n // since it axis aligns)\n if (areas.length >= 8) {\n const constrained = constrainedMDSLayout(areas, params),\n constrainedLoss = loss(constrained, areas),\n greedyLoss = loss(initial, areas);\n\n if (constrainedLoss + 1e-8 < greedyLoss) {\n initial = constrained;\n }\n }\n return initial;\n}\n\n/// use the constrained MDS variant to generate an initial layout\nexport function constrainedMDSLayout(areas, params) {\n params = params || {};\n const restarts = params.restarts || 10;\n\n // bidirectionally map sets to a rowid (so we can create a matrix)\n const sets = [],\n setids = {};\n let i;\n for (i = 0; i < areas.length; ++i) {\n const area = areas[i];\n if (area.sets.length == 1) {\n setids[area.sets[0]] = sets.length;\n sets.push(area);\n }\n }\n\n const matrices = getDistanceMatrices(areas, sets, setids);\n let distances = matrices.distances;\n const constraints = matrices.constraints;\n\n // keep distances bounded, things get messed up otherwise.\n // TODO: proper preconditioner?\n const norm = norm2(distances.map(norm2)) / distances.length;\n distances = distances.map(function (row) {\n return row.map(function (value) {\n return value / norm;\n });\n });\n\n const obj = function (x, fxprime) {\n return constrainedMDSGradient(x, fxprime, distances, constraints);\n };\n\n let best, current;\n for (i = 0; i < restarts; ++i) {\n const initial = zeros(distances.length * 2).map(Math.random);\n\n current = conjugateGradient(obj, initial, params);\n if (!best || current.fx < best.fx) {\n best = current;\n }\n }\n const positions = best.x;\n\n // translate rows back to (x,y,radius) coordinates\n const circles = {};\n for (i = 0; i < sets.length; ++i) {\n const set = sets[i];\n circles[set.sets[0]] = {\n x: positions[2 * i] * norm,\n y: positions[2 * i + 1] * norm,\n radius: Math.sqrt(set.size / Math.PI),\n };\n }\n\n if (params.history) {\n for (i = 0; i < params.history.length; ++i) {\n scale(params.history[i].x, norm);\n }\n }\n return circles;\n}\n\n/** Lays out a Venn diagram greedily, going from most overlapped sets to\nleast overlapped, attempting to position each new set such that the\noverlapping areas to already positioned sets are basically right */\nexport function greedyLayout(areas, params) {\n const loss = params && params.lossFunction ? params.lossFunction : lossFunction;\n // define a circle for each set\n const circles = {},\n setOverlaps = {};\n let set;\n for (let i = 0; i < areas.length; ++i) {\n const area = areas[i];\n if (area.sets.length == 1) {\n set = area.sets[0];\n circles[set] = {\n x: 1e10,\n y: 1e10,\n // rowid: circles.length, // fix to ->\n rowid: Object.keys(circles).length,\n size: area.size,\n radius: Math.sqrt(area.size / Math.PI),\n };\n setOverlaps[set] = [];\n }\n }\n areas = areas.filter(function (a) {\n return a.sets.length == 2;\n });\n\n // map each set to a list of all the other sets that overlap it\n for (let i = 0; i < areas.length; ++i) {\n const current = areas[i];\n // eslint-disable-next-line\n let weight = current.hasOwnProperty('weight') ? current.weight : 1.0;\n const left = current.sets[0],\n right = current.sets[1];\n\n // completely overlapped circles shouldn't be positioned early here\n if (current.size + SMALL >= Math.min(circles[left].size, circles[right].size)) {\n weight = 0;\n }\n\n setOverlaps[left].push({ set: right, size: current.size, weight: weight });\n setOverlaps[right].push({ set: left, size: current.size, weight: weight });\n }\n\n // get list of most overlapped sets\n const mostOverlapped = [];\n for (set in setOverlaps) {\n // eslint-disable-next-line\n if (setOverlaps.hasOwnProperty(set)) {\n let size = 0;\n for (let i = 0; i < setOverlaps[set].length; ++i) {\n size += setOverlaps[set][i].size * setOverlaps[set][i].weight;\n }\n\n mostOverlapped.push({ set: set, size: size });\n }\n }\n\n // sort by size desc\n function sortOrder(a, b) {\n return b.size - a.size;\n }\n mostOverlapped.sort(sortOrder);\n\n // keep track of what sets have been laid out\n const positioned = {};\n function isPositioned(element) {\n return element.set in positioned;\n }\n\n // adds a point to the output\n function positionSet(point, index) {\n circles[index].x = point.x;\n circles[index].y = point.y;\n positioned[index] = true;\n }\n\n // add most overlapped set at (0,0)\n positionSet({ x: 0, y: 0 }, mostOverlapped[0].set);\n\n // get distances between all points. TODO, necessary?\n // answer: probably not\n // var distances = venn.getDistanceMatrices(circles, areas).distances;\n for (let i = 1; i < mostOverlapped.length; ++i) {\n const setIndex = mostOverlapped[i].set,\n overlap = setOverlaps[setIndex].filter(isPositioned);\n set = circles[setIndex];\n overlap.sort(sortOrder);\n\n if (overlap.length === 0) {\n // this shouldn't happen anymore with addMissingAreas\n throw 'ERROR: missing pairwise overlap information';\n }\n\n const points = [];\n for (let j = 0; j < overlap.length; ++j) {\n // get appropriate distance from most overlapped already added set\n const p1 = circles[overlap[j].set],\n d1 = distanceFromIntersectArea(set.radius, p1.radius, overlap[j].size);\n\n // sample positions at 90 degrees for maximum aesthetics\n points.push({ x: p1.x + d1, y: p1.y });\n points.push({ x: p1.x - d1, y: p1.y });\n points.push({ y: p1.y + d1, x: p1.x });\n points.push({ y: p1.y - d1, x: p1.x });\n\n // if we have at least 2 overlaps, then figure out where the\n // set should be positioned analytically and try those too\n for (let k = j + 1; k < overlap.length; ++k) {\n const p2 = circles[overlap[k].set],\n d2 = distanceFromIntersectArea(set.radius, p2.radius, overlap[k].size);\n\n const extraPoints = circleCircleIntersection(\n { x: p1.x, y: p1.y, radius: d1 },\n { x: p2.x, y: p2.y, radius: d2 }\n );\n\n for (let l = 0; l < extraPoints.length; ++l) {\n points.push(extraPoints[l]);\n }\n }\n }\n\n // we have some candidate positions for the set, examine loss\n // at each position to figure out where to put it at\n let bestLoss = 1e50,\n bestPoint = points[0];\n for (let j = 0; j < points.length; ++j) {\n circles[setIndex].x = points[j].x;\n circles[setIndex].y = points[j].y;\n const localLoss = loss(circles, areas);\n if (localLoss < bestLoss) {\n bestLoss = localLoss;\n bestPoint = points[j];\n }\n }\n\n positionSet(bestPoint, setIndex);\n }\n\n return circles;\n}\n\n/** Given a bunch of sets, and the desired overlaps between these sets - computes\nthe distance from the actual overlaps to the desired overlaps. Note that\nthis method ignores overlaps of more than 2 circles */\nexport function lossFunction(sets, overlaps) {\n let output = 0;\n\n function getCircles(indices) {\n return indices.map(function (i) {\n return sets[i];\n });\n }\n\n for (let i = 0; i < overlaps.length; ++i) {\n const area = overlaps[i];\n let overlap;\n if (area.sets.length == 1) {\n continue;\n } else if (area.sets.length == 2) {\n const left = sets[area.sets[0]],\n right = sets[area.sets[1]];\n overlap = circleOverlap(left.radius, right.radius, distance(left, right));\n } else {\n overlap = intersectionArea(getCircles(area.sets));\n }\n\n // eslint-disable-next-line\n const weight = area.hasOwnProperty('weight') ? area.weight : 1.0;\n output += weight * (overlap - area.size) * (overlap - area.size);\n }\n\n return output;\n}\n\n// orientates a bunch of circles to point in orientation\nfunction orientateCircles(circles, orientation, orientationOrder) {\n if (orientationOrder === null) {\n circles.sort(function (a, b) {\n return b.radius - a.radius;\n });\n } else {\n circles.sort(orientationOrder);\n }\n\n let i;\n // shift circles so largest circle is at (0, 0)\n if (circles.length > 0) {\n const largestX = circles[0].x,\n largestY = circles[0].y;\n\n for (i = 0; i < circles.length; ++i) {\n circles[i].x -= largestX;\n circles[i].y -= largestY;\n }\n }\n\n if (circles.length == 2) {\n // if the second circle is a subset of the first, arrange so that\n // it is off to one side. hack for https://github.com/benfred/venn.js/issues/120\n const dist = distance(circles[0], circles[1]);\n if (dist < Math.abs(circles[1].radius - circles[0].radius)) {\n circles[1].x = circles[0].x + circles[0].radius - circles[1].radius - 1e-10;\n circles[1].y = circles[0].y;\n }\n }\n\n // rotate circles so that second largest is at an angle of 'orientation'\n // from largest\n if (circles.length > 1) {\n const rotation = Math.atan2(circles[1].x, circles[1].y) - orientation;\n let x, y;\n const c = Math.cos(rotation),\n s = Math.sin(rotation);\n for (i = 0; i < circles.length; ++i) {\n x = circles[i].x;\n y = circles[i].y;\n circles[i].x = c * x - s * y;\n circles[i].y = s * x + c * y;\n }\n }\n\n // mirror solution if third solution is above plane specified by\n // first two circles\n if (circles.length > 2) {\n let angle = Math.atan2(circles[2].x, circles[2].y) - orientation;\n while (angle < 0) {\n angle += 2 * Math.PI;\n }\n while (angle > 2 * Math.PI) {\n angle -= 2 * Math.PI;\n }\n if (angle > Math.PI) {\n const slope = circles[1].y / (1e-10 + circles[1].x);\n for (i = 0; i < circles.length; ++i) {\n const d = (circles[i].x + slope * circles[i].y) / (1 + slope * slope);\n circles[i].x = 2 * d - circles[i].x;\n circles[i].y = 2 * d * slope - circles[i].y;\n }\n }\n }\n}\n\nexport function disjointCluster(circles) {\n // union-find clustering to get disjoint sets\n circles.map(function (circle) {\n circle.parent = circle;\n });\n\n // path compression step in union find\n function find(circle) {\n if (circle.parent !== circle) {\n circle.parent = find(circle.parent);\n }\n return circle.parent;\n }\n\n function union(x, y) {\n const xRoot = find(x),\n yRoot = find(y);\n xRoot.parent = yRoot;\n }\n\n // get the union of all overlapping sets\n for (let i = 0; i < circles.length; ++i) {\n for (let j = i + 1; j < circles.length; ++j) {\n const maxDistance = circles[i].radius + circles[j].radius;\n if (distance(circles[i], circles[j]) + 1e-10 < maxDistance) {\n union(circles[j], circles[i]);\n }\n }\n }\n\n // find all the disjoint clusters and group them together\n const disjointClusters = {};\n let setid;\n for (let i = 0; i < circles.length; ++i) {\n setid = find(circles[i]).parent.setid;\n if (!(setid in disjointClusters)) {\n disjointClusters[setid] = [];\n }\n disjointClusters[setid].push(circles[i]);\n }\n\n // cleanup bookkeeping\n circles.map(function (circle) {\n delete circle.parent;\n });\n\n // return in more usable form\n const ret = [];\n for (setid in disjointClusters) {\n // eslint-disable-next-line\n if (disjointClusters.hasOwnProperty(setid)) {\n ret.push(disjointClusters[setid]);\n }\n }\n return ret;\n}\n\nfunction getBoundingBox(circles) {\n const minMax = function (d) {\n const hi = Math.max.apply(\n null,\n circles.map(function (c) {\n return c[d] + c.radius;\n })\n ),\n lo = Math.min.apply(\n null,\n circles.map(function (c) {\n return c[d] - c.radius;\n })\n );\n return { max: hi, min: lo };\n };\n\n return { xRange: minMax('x'), yRange: minMax('y') };\n}\n\nexport function normalizeSolution(solution, orientation, orientationOrder) {\n if (orientation === null) {\n orientation = Math.PI / 2;\n }\n\n // work with a list instead of a dictionary, and take a copy so we\n // don't mutate input\n let circles = [],\n i,\n setid;\n for (setid in solution) {\n // eslint-disable-next-line\n if (solution.hasOwnProperty(setid)) {\n const previous = solution[setid];\n circles.push({ x: previous.x, y: previous.y, radius: previous.radius, setid: setid });\n }\n }\n\n // get all the disjoint clusters\n const clusters = disjointCluster(circles);\n\n // orientate all disjoint sets, get sizes\n for (i = 0; i < clusters.length; ++i) {\n orientateCircles(clusters[i], orientation, orientationOrder);\n const bounds = getBoundingBox(clusters[i]);\n clusters[i].size = (bounds.xRange.max - bounds.xRange.min) * (bounds.yRange.max - bounds.yRange.min);\n clusters[i].bounds = bounds;\n }\n clusters.sort(function (a, b) {\n return b.size - a.size;\n });\n\n // orientate the largest at 0,0, and get the bounds\n circles = clusters[0];\n // @ts-ignore fixme 从逻辑上看似乎是不对的,后续看看\n let returnBounds = circles.bounds;\n\n const spacing = (returnBounds.xRange.max - returnBounds.xRange.min) / 50;\n\n function addCluster(cluster, right, bottom) {\n if (!cluster) return;\n\n const bounds = cluster.bounds;\n let xOffset, yOffset, centreing;\n\n if (right) {\n xOffset = returnBounds.xRange.max - bounds.xRange.min + spacing;\n } else {\n xOffset = returnBounds.xRange.max - bounds.xRange.max;\n centreing = (bounds.xRange.max - bounds.xRange.min) / 2 - (returnBounds.xRange.max - returnBounds.xRange.min) / 2;\n if (centreing < 0) xOffset += centreing;\n }\n\n if (bottom) {\n yOffset = returnBounds.yRange.max - bounds.yRange.min + spacing;\n } else {\n yOffset = returnBounds.yRange.max - bounds.yRange.max;\n centreing = (bounds.yRange.max - bounds.yRange.min) / 2 - (returnBounds.yRange.max - returnBounds.yRange.min) / 2;\n if (centreing < 0) yOffset += centreing;\n }\n\n for (let j = 0; j < cluster.length; ++j) {\n cluster[j].x += xOffset;\n cluster[j].y += yOffset;\n circles.push(cluster[j]);\n }\n }\n\n let index = 1;\n while (index < clusters.length) {\n addCluster(clusters[index], true, false);\n addCluster(clusters[index + 1], false, true);\n addCluster(clusters[index + 2], true, true);\n index += 3;\n\n // have one cluster (in top left). lay out next three relative\n // to it in a grid\n returnBounds = getBoundingBox(circles);\n }\n\n // convert back to solution form\n const ret = {};\n for (i = 0; i < circles.length; ++i) {\n ret[circles[i].setid] = circles[i];\n }\n return ret;\n}\n\n/** Scales a solution from venn.venn or venn.greedyLayout such that it fits in\na rectangle of width/height - with padding around the borders. also\ncenters the diagram in the available space at the same time */\nexport function scaleSolution(solution, width, height, padding) {\n const circles = [],\n setids = [];\n for (const setid in solution) {\n // eslint-disable-next-line\n if (solution.hasOwnProperty(setid)) {\n setids.push(setid);\n circles.push(solution[setid]);\n }\n }\n\n width -= 2 * padding;\n height -= 2 * padding;\n\n const bounds = getBoundingBox(circles),\n xRange = bounds.xRange,\n yRange = bounds.yRange;\n\n if (xRange.max == xRange.min || yRange.max == yRange.min) {\n console.log('not scaling solution: zero size detected');\n return solution;\n }\n\n const xScaling = width / (xRange.max - xRange.min),\n yScaling = height / (yRange.max - yRange.min),\n scaling = Math.min(yScaling, xScaling),\n // while we're at it, center the diagram too\n xOffset = (width - (xRange.max - xRange.min) * scaling) / 2,\n yOffset = (height - (yRange.max - yRange.min) * scaling) / 2;\n\n const scaled = {};\n for (let i = 0; i < circles.length; ++i) {\n const circle = circles[i];\n scaled[setids[i]] = {\n radius: scaling * circle.radius,\n x: padding + xOffset + (circle.x - xRange.min) * scaling,\n y: padding + yOffset + (circle.y - yRange.min) * scaling,\n };\n }\n\n return scaled;\n}\n"]}