@loopstack/loopstack-studio 0.25.0 → 0.25.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ai-elements/message.js +2 -2
- package/dist/components/ai-elements/reasoning.js +9 -9
- package/dist/loopstack-studio.css +1 -1
- package/dist/node_modules/@chevrotain/gast/lib/src/helpers.js +2 -5
- package/dist/node_modules/@chevrotain/gast/lib/src/model.js +69 -72
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/{architecture-7HQA4BMR.js → architecture-YZFGNWBL.js} +2 -2
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/{chunk-TQ3KTPDO.js → chunk-2KRD3SAO.js} +1 -1
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/{chunk-4F5CHEZ2.js → chunk-67CJDMHE.js} +1 -1
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/{chunk-UMXZTB3W.js → chunk-7N4EOEYR.js} +5 -2
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/{chunk-PL6DKKU2.js → chunk-AA7GKIK3.js} +1 -1
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-CIAEETIT.js +23 -0
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/{chunk-SJTYNZTY.js → chunk-FOC6F5B3.js} +1 -1
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-K5T4RW27.js +1197 -0
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/{chunk-FRFDVMJY.js → chunk-KGLVRYIC.js} +1 -1
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/{chunk-B2363JML.js → chunk-LIHQZDEY.js} +1 -1
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-ORNJ4GCN.js +29 -0
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/{gitGraph-G5XIXVHT.js → gitGraph-7Q5UKJZL.js} +2 -2
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/info-OMHHGYJF.js +3 -0
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/packet-4T2RLAQJ.js +3 -0
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/pie-ZZUOXDRM.js +3 -0
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/radar-PYXPWWZC.js +3 -0
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/treeView-SZITEDCU.js +3 -0
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/treemap-W4RFUUIX.js +3 -0
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/wardley-RL74JXVD.js +3 -0
- package/dist/node_modules/@mermaid-js/parser/dist/mermaid-parser.core.js +27 -17
- package/dist/node_modules/@upsetjs/venn.js/build/venn.esm.js +903 -0
- package/dist/node_modules/@xyflow/react/dist/esm/index.js +76 -75
- package/dist/node_modules/@xyflow/system/dist/esm/index.js +30 -28
- package/dist/node_modules/chevrotain/lib/src/parse/cst/cst_visitor.js +31 -40
- package/dist/node_modules/chevrotain/lib/src/parse/errors_public.js +23 -26
- package/dist/node_modules/chevrotain/lib/src/parse/exceptions_public.js +12 -13
- package/dist/node_modules/chevrotain/lib/src/parse/grammar/checks.js +181 -205
- package/dist/node_modules/chevrotain/lib/src/parse/grammar/first.js +11 -13
- package/dist/node_modules/chevrotain/lib/src/parse/grammar/follow.js +12 -13
- package/dist/node_modules/chevrotain/lib/src/parse/grammar/gast/gast_resolver_public.js +8 -9
- package/dist/node_modules/chevrotain/lib/src/parse/grammar/interpreter.js +176 -183
- package/dist/node_modules/chevrotain/lib/src/parse/grammar/llk_lookahead.js +17 -19
- package/dist/node_modules/chevrotain/lib/src/parse/grammar/lookahead.js +153 -160
- package/dist/node_modules/chevrotain/lib/src/parse/grammar/resolver.js +10 -12
- package/dist/node_modules/chevrotain/lib/src/parse/grammar/rest.js +36 -38
- package/dist/node_modules/chevrotain/lib/src/parse/parser/parser.js +37 -45
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/error_handler.js +12 -14
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/gast_recorder.js +80 -86
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/lexer_adapter.js +6 -2
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/looksahead.js +39 -41
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/perf_tracer.js +7 -8
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/recognizer_api.js +69 -70
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/recognizer_engine.js +215 -205
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/recoverable.js +76 -76
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/tree_builder.js +29 -39
- package/dist/node_modules/chevrotain/lib/src/scan/lexer.js +252 -274
- package/dist/node_modules/chevrotain/lib/src/scan/lexer_public.js +93 -106
- package/dist/node_modules/chevrotain/lib/src/scan/reg_exp.js +61 -61
- package/dist/node_modules/chevrotain/lib/src/scan/tokens.js +31 -41
- package/dist/node_modules/chevrotain/lib/src/scan/tokens_public.js +15 -18
- package/dist/node_modules/chevrotain-allstar/lib/all-star-lookahead.js +226 -226
- package/dist/node_modules/chevrotain-allstar/lib/atn.js +17 -17
- package/dist/node_modules/cytoscape/dist/cytoscape.esm.js +17 -14
- package/dist/node_modules/dagre-d3-es/src/dagre/greedy-fas.js +19 -19
- package/dist/node_modules/dagre-d3-es/src/dagre/layout.js +48 -48
- package/dist/node_modules/dagre-d3-es/src/dagre/nesting-graph.js +9 -9
- package/dist/node_modules/dagre-d3-es/src/dagre/order/cross-count.js +3 -3
- package/dist/node_modules/dagre-d3-es/src/dagre/order/index.js +11 -11
- package/dist/node_modules/dagre-d3-es/src/dagre/order/init-order.js +4 -4
- package/dist/node_modules/dagre-d3-es/src/dagre/order/resolve-conflicts.js +4 -4
- package/dist/node_modules/dagre-d3-es/src/dagre/order/sort-subgraph.js +8 -8
- package/dist/node_modules/dagre-d3-es/src/dagre/order/sort.js +5 -5
- package/dist/node_modules/dagre-d3-es/src/dagre/position/bk.js +61 -61
- package/dist/node_modules/dagre-d3-es/src/dagre/position/index.js +1 -1
- package/dist/node_modules/dagre-d3-es/src/dagre/rank/network-simplex.js +25 -25
- package/dist/node_modules/dagre-d3-es/src/dagre/rank/util.js +8 -8
- package/dist/node_modules/dagre-d3-es/src/dagre/util.js +48 -48
- package/dist/node_modules/dagre-d3-es/src/graphlib/graph.js +109 -109
- package/dist/node_modules/dagre-d3-es/src/graphlib/json.js +17 -17
- package/dist/node_modules/dompurify/dist/purify.es.js +67 -67
- package/dist/node_modules/katex/dist/katex.js +1256 -1209
- package/dist/node_modules/khroma/dist/methods/transparentize.js +3 -0
- package/dist/node_modules/lodash-es/_baseClone.js +2 -2
- package/dist/node_modules/lodash-es/_baseMatchesProperty.js +6 -6
- package/dist/node_modules/lodash-es/_baseToString.js +1 -1
- package/dist/node_modules/lodash-es/_baseUniq.js +1 -1
- package/dist/node_modules/lodash-es/_createSet.js +1 -1
- package/dist/node_modules/lodash-es/_getAllKeys.js +2 -2
- package/dist/node_modules/lodash-es/_getAllKeysIn.js +1 -1
- package/dist/node_modules/lodash-es/findIndex.js +2 -2
- package/dist/node_modules/lodash-es/flatMap.js +1 -1
- package/dist/node_modules/lodash-es/forEach.js +1 -1
- package/dist/node_modules/lodash-es/max.js +1 -1
- package/dist/node_modules/lodash-es/min.js +1 -1
- package/dist/node_modules/lodash-es/minBy.js +1 -1
- package/dist/node_modules/lodash-es/reduce.js +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/architectureDiagram-Q4EWVU46.js +691 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{blockDiagram-VD42YOAC.js → blockDiagram-DXYQGD6D.js} +183 -157
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{c4Diagram-YG6GDRKO.js → c4Diagram-AHTNJAMY.js} +65 -63
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-336JU56O.js +47 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{chunk-EXTU4WIE.js → chunk-426QAEUC.js} +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{chunk-B4BG7PRW.js → chunk-4TB4RGXK.js} +533 -393
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-5FUZZQ4R.js +3638 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{chunk-S3R3BYOJ.js → chunk-5PVQY5BW.js} +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{chunk-HN2XXSSU.js → chunk-BSJP7CBP.js} +20 -14
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{chunk-QN33PNHL.js → chunk-EDXVE4YY.js} +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-ENJZ2VHE.js +568 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-ICPOFSXX.js +2320 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{chunk-DI55MBZ5.js → chunk-OYMX7WX6.js} +35 -21
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-U2HBQHQK.js +272 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{chunk-ATLVNIR6.js → chunk-X2U36JSP.js} +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{chunk-MI3HLSF2.js → chunk-XPW4576I.js} +11 -7
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-YZCP3GAM.js +60 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-ZZ45TVLE.js +30 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{classDiagram-2ON5EDUG.js → classDiagram-6PBFFD2Q.js} +12 -11
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{classDiagram-v2-WZHVMYZB.js → classDiagram-v2-HSJHXN6E.js} +12 -11
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{dagre-6UL2VRFP.js → dagre-KV5264BT.js} +8 -8
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/diagram-5BDNPKRD.js +99 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{diagram-PSM6KHXK.js → diagram-G4DWMVQ6.js} +20 -23
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/diagram-MMDJMWI5.js +211 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{diagram-S2PKOQOG.js → diagram-TYMM5635.js} +4 -4
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{erDiagram-Q2GNP2WA.js → erDiagram-SMLLAGMA.js} +486 -386
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{flowDiagram-NV44I4VS.js → flowDiagram-DWJPFMVM.js} +915 -898
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{ganttDiagram-JELNMOA3.js → ganttDiagram-T4ZO3ILL.js} +59 -29
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/gitGraphDiagram-UUTBAWPF.js +728 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/infoDiagram-42DDH7IO.js +17 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/ishikawaDiagram-UXIWVN3A.js +714 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{journeyDiagram-XKPGCS4Q.js → journeyDiagram-VCZTEJTY.js} +32 -32
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{kanban-definition-3W4ZIXB7.js → kanban-definition-6JOO6SKY.js} +13 -9
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{mindmap-definition-VGOIOE7T.js → mindmap-definition-QFDTVHPH.js} +105 -59
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/pieDiagram-DEJITSTG.js +117 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{quadrantDiagram-AYHSOK5B.js → quadrantDiagram-34T5L4WZ.js} +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{requirementDiagram-UZGBJVZJ.js → requirementDiagram-MS252O5E.js} +49 -19
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{sankeyDiagram-TZEHDZUN.js → sankeyDiagram-XADWPNL6.js} +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-FGHM5R23.js +4155 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{stateDiagram-FKZM4ZOC.js → stateDiagram-FHFEXIEX.js} +12 -12
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{stateDiagram-v2-4FDKWEC3.js → stateDiagram-v2-QKLJ7IA2.js} +11 -11
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/timeline-definition-GMOUNBTQ.js +1071 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/vennDiagram-DHZGUBPP.js +959 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/wardleyDiagram-NUSXRM2D.js +574 -0
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/{xychartDiagram-PRI3JC2R.js → xychartDiagram-5P7HB3ND.js} +38 -35
- package/dist/node_modules/mermaid/dist/mermaid.core.js +235 -192
- package/dist/node_modules/nanoid/url-alphabet/index.js +1 -1
- package/dist/node_modules/remend/dist/index.js +333 -264
- package/dist/node_modules/streamdown/dist/chunk-BO2N2NFS.js +2498 -0
- package/dist/node_modules/streamdown/dist/highlighted-body-OFNGDK62.js +35 -0
- package/dist/node_modules/streamdown/dist/index.js +1 -1
- package/dist/node_modules/streamdown/dist/mermaid-GHXKKRXX.js +3 -0
- package/dist/node_modules/streamdown/node_modules/marked/lib/marked.esm.js +672 -667
- package/dist/pages/DashboardPage.js +3 -3
- package/package.json +2 -2
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-TCCFYFTB.js +0 -787
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/info-VBDWY6EO.js +0 -3
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/packet-DYOGHKS2.js +0 -3
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/pie-VRWISCQL.js +0 -3
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/radar-ZZBFDIW7.js +0 -3
- package/dist/node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/treemap-GDKQZRPO.js +0 -3
- package/dist/node_modules/chevrotain/lib/src/parse/parser/traits/context_assist.js +0 -16
- package/dist/node_modules/lodash-es/_arrayAggregator.js +0 -9
- package/dist/node_modules/lodash-es/_arrayEvery.js +0 -6
- package/dist/node_modules/lodash-es/_baseAggregator.js +0 -8
- package/dist/node_modules/lodash-es/_baseDifference.js +0 -22
- package/dist/node_modules/lodash-es/_baseEvery.js +0 -9
- package/dist/node_modules/lodash-es/_baseIsRegExp.js +0 -8
- package/dist/node_modules/lodash-es/_baseSlice.js +0 -8
- package/dist/node_modules/lodash-es/_baseSome.js +0 -9
- package/dist/node_modules/lodash-es/_createAggregator.js +0 -12
- package/dist/node_modules/lodash-es/assign.js +0 -14
- package/dist/node_modules/lodash-es/compact.js +0 -9
- package/dist/node_modules/lodash-es/difference.js +0 -8
- package/dist/node_modules/lodash-es/drop.js +0 -8
- package/dist/node_modules/lodash-es/dropRight.js +0 -8
- package/dist/node_modules/lodash-es/every.js +0 -11
- package/dist/node_modules/lodash-es/groupBy.js +0 -6
- package/dist/node_modules/lodash-es/head.js +0 -5
- package/dist/node_modules/lodash-es/includes.js +0 -13
- package/dist/node_modules/lodash-es/indexOf.js +0 -11
- package/dist/node_modules/lodash-es/isRegExp.js +0 -5
- package/dist/node_modules/lodash-es/negate.js +0 -16
- package/dist/node_modules/lodash-es/pickBy.js +0 -15
- package/dist/node_modules/lodash-es/reject.js +0 -10
- package/dist/node_modules/lodash-es/some.js +0 -11
- package/dist/node_modules/lodash-es/uniq.js +0 -6
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/architectureDiagram-VXUJARFQ.js +0 -673
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-ABZYJK2D.js +0 -1547
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-CVBHYZKI.js +0 -10
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-DR5Q36YT.js +0 -135
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-JA3XYJ7Z.js +0 -247
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-JZLCHNYA.js +0 -3516
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-N4CR4FBY.js +0 -39
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-QXUST7PY.js +0 -497
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.js +0 -55
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/diagram-QEK2KX5R.js +0 -211
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/gitGraphDiagram-V2S2FVAM.js +0 -621
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/infoDiagram-HS3SLOUP.js +0 -18
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/pieDiagram-ADFJNKIX.js +0 -117
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.js +0 -3560
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/timeline-definition-IT6M3QCI.js +0 -833
- package/dist/node_modules/streamdown/dist/chunk-RLXIAIE6.js +0 -2189
- package/dist/node_modules/streamdown/dist/highlighted-body-B3W2YXNL.js +0 -33
- package/dist/node_modules/streamdown/dist/mermaid-3ZIDBTTL.js +0 -3
|
@@ -0,0 +1,903 @@
|
|
|
1
|
+
var SMALL$1 = 1e-10;
|
|
2
|
+
function intersectionArea(d, g) {
|
|
3
|
+
let _ = getIntersectionPoints(d), y = _.filter((e) => containedInCircles(e, d)), b = 0, x = 0, S = [];
|
|
4
|
+
if (y.length > 1) {
|
|
5
|
+
let e = getCenter(y);
|
|
6
|
+
for (let d = 0; d < y.length; ++d) {
|
|
7
|
+
let f = y[d];
|
|
8
|
+
f.angle = Math.atan2(f.x - e.x, f.y - e.y);
|
|
9
|
+
}
|
|
10
|
+
y.sort((e, d) => d.angle - e.angle);
|
|
11
|
+
let f = y[y.length - 1];
|
|
12
|
+
for (let e = 0; e < y.length; ++e) {
|
|
13
|
+
let p = y[e];
|
|
14
|
+
x += (f.x + p.x) * (p.y - f.y);
|
|
15
|
+
let g = {
|
|
16
|
+
x: (p.x + f.x) / 2,
|
|
17
|
+
y: (p.y + f.y) / 2
|
|
18
|
+
}, _ = null;
|
|
19
|
+
for (let e = 0; e < p.parentIndex.length; ++e) if (f.parentIndex.includes(p.parentIndex[e])) {
|
|
20
|
+
let m = d[p.parentIndex[e]], v = Math.atan2(p.x - m.x, p.y - m.y), y = Math.atan2(f.x - m.x, f.y - m.y), b = y - v;
|
|
21
|
+
b < 0 && (b += 2 * Math.PI);
|
|
22
|
+
let x = y - b / 2, S = distance(g, {
|
|
23
|
+
x: m.x + m.radius * Math.sin(x),
|
|
24
|
+
y: m.y + m.radius * Math.cos(x)
|
|
25
|
+
});
|
|
26
|
+
S > m.radius * 2 && (S = m.radius * 2), (_ == null || _.width > S) && (_ = {
|
|
27
|
+
circle: m,
|
|
28
|
+
width: S,
|
|
29
|
+
p1: p,
|
|
30
|
+
p2: f,
|
|
31
|
+
large: S > m.radius,
|
|
32
|
+
sweep: !0
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
_ != null && (S.push(_), b += circleArea(_.circle.radius, _.width), f = p);
|
|
36
|
+
}
|
|
37
|
+
} else {
|
|
38
|
+
let f = d[0];
|
|
39
|
+
for (let e = 1; e < d.length; ++e) d[e].radius < f.radius && (f = d[e]);
|
|
40
|
+
let p = !1;
|
|
41
|
+
for (let e = 0; e < d.length; ++e) if (distance(d[e], f) > Math.abs(f.radius - d[e].radius)) {
|
|
42
|
+
p = !0;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
p ? b = x = 0 : (b = f.radius * f.radius * Math.PI, S.push({
|
|
46
|
+
circle: f,
|
|
47
|
+
p1: {
|
|
48
|
+
x: f.x,
|
|
49
|
+
y: f.y + f.radius
|
|
50
|
+
},
|
|
51
|
+
p2: {
|
|
52
|
+
x: f.x - SMALL$1,
|
|
53
|
+
y: f.y + f.radius
|
|
54
|
+
},
|
|
55
|
+
width: f.radius * 2,
|
|
56
|
+
large: !0,
|
|
57
|
+
sweep: !0
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
return x /= 2, g && (g.area = b + x, g.arcArea = b, g.polygonArea = x, g.arcs = S, g.innerPoints = y, g.intersectionPoints = _), b + x;
|
|
61
|
+
}
|
|
62
|
+
function containedInCircles(d, f) {
|
|
63
|
+
return f.every((f) => distance(d, f) < f.radius + SMALL$1);
|
|
64
|
+
}
|
|
65
|
+
function getIntersectionPoints(e) {
|
|
66
|
+
let d = [];
|
|
67
|
+
for (let f = 0; f < e.length; ++f) for (let p = f + 1; p < e.length; ++p) {
|
|
68
|
+
let m = circleCircleIntersection(e[f], e[p]);
|
|
69
|
+
for (let e of m) e.parentIndex = [f, p], d.push(e);
|
|
70
|
+
}
|
|
71
|
+
return d;
|
|
72
|
+
}
|
|
73
|
+
function circleArea(e, d) {
|
|
74
|
+
return e * e * Math.acos(1 - d / e) - (e - d) * Math.sqrt(d * (2 * e - d));
|
|
75
|
+
}
|
|
76
|
+
function distance(e, d) {
|
|
77
|
+
return Math.sqrt((e.x - d.x) * (e.x - d.x) + (e.y - d.y) * (e.y - d.y));
|
|
78
|
+
}
|
|
79
|
+
function circleOverlap(e, d, f) {
|
|
80
|
+
if (f >= e + d) return 0;
|
|
81
|
+
if (f <= Math.abs(e - d)) return Math.PI * Math.min(e, d) * Math.min(e, d);
|
|
82
|
+
let p = e - (f * f - d * d + e * e) / (2 * f), h = d - (f * f - e * e + d * d) / (2 * f);
|
|
83
|
+
return circleArea(e, p) + circleArea(d, h);
|
|
84
|
+
}
|
|
85
|
+
function circleCircleIntersection(e, d) {
|
|
86
|
+
let f = distance(e, d), p = e.radius, m = d.radius;
|
|
87
|
+
if (f >= p + m || f <= Math.abs(p - m)) return [];
|
|
88
|
+
let g = (p * p - m * m + f * f) / (2 * f), _ = Math.sqrt(p * p - g * g), v = e.x + g * (d.x - e.x) / f, y = e.y + g * (d.y - e.y) / f, b = -(d.y - e.y) * (_ / f), x = -(d.x - e.x) * (_ / f);
|
|
89
|
+
return [{
|
|
90
|
+
x: v + b,
|
|
91
|
+
y: y - x
|
|
92
|
+
}, {
|
|
93
|
+
x: v - b,
|
|
94
|
+
y: y + x
|
|
95
|
+
}];
|
|
96
|
+
}
|
|
97
|
+
function getCenter(e) {
|
|
98
|
+
let d = {
|
|
99
|
+
x: 0,
|
|
100
|
+
y: 0
|
|
101
|
+
};
|
|
102
|
+
for (let f of e) d.x += f.x, d.y += f.y;
|
|
103
|
+
return d.x /= e.length, d.y /= e.length, d;
|
|
104
|
+
}
|
|
105
|
+
function bisect(e, d, f, p) {
|
|
106
|
+
p ||= {};
|
|
107
|
+
let m = p.maxIterations || 100, h = p.tolerance || 1e-10, g = e(d), _ = e(f), v = f - d;
|
|
108
|
+
if (g * _ > 0) throw "Initial bisect points must have opposite signs";
|
|
109
|
+
if (g === 0) return d;
|
|
110
|
+
if (_ === 0) return f;
|
|
111
|
+
for (let f = 0; f < m; ++f) {
|
|
112
|
+
v /= 2;
|
|
113
|
+
let f = d + v, p = e(f);
|
|
114
|
+
if (p * g >= 0 && (d = f), Math.abs(v) < h || p === 0) return f;
|
|
115
|
+
}
|
|
116
|
+
return d + v;
|
|
117
|
+
}
|
|
118
|
+
function zeros(e) {
|
|
119
|
+
let d = Array(e);
|
|
120
|
+
for (let f = 0; f < e; ++f) d[f] = 0;
|
|
121
|
+
return d;
|
|
122
|
+
}
|
|
123
|
+
function zerosM(e, d) {
|
|
124
|
+
return zeros(e).map(() => zeros(d));
|
|
125
|
+
}
|
|
126
|
+
function dot(e, d) {
|
|
127
|
+
let f = 0;
|
|
128
|
+
for (let p = 0; p < e.length; ++p) f += e[p] * d[p];
|
|
129
|
+
return f;
|
|
130
|
+
}
|
|
131
|
+
function norm2(e) {
|
|
132
|
+
return Math.sqrt(dot(e, e));
|
|
133
|
+
}
|
|
134
|
+
function scale(e, d, f) {
|
|
135
|
+
for (let p = 0; p < d.length; ++p) e[p] = d[p] * f;
|
|
136
|
+
}
|
|
137
|
+
function weightedSum(e, d, f, p, m) {
|
|
138
|
+
for (let h = 0; h < e.length; ++h) e[h] = d * f[h] + p * m[h];
|
|
139
|
+
}
|
|
140
|
+
function nelderMead(e, d, f) {
|
|
141
|
+
f ||= {};
|
|
142
|
+
let p = f.maxIterations || d.length * 200, m = f.nonZeroDelta || 1.05, h = f.zeroDelta || .001, g = f.minErrorDelta || 1e-6, _ = f.minErrorDelta || 1e-5, v = f.rho === void 0 ? 1 : f.rho, y = f.chi === void 0 ? 2 : f.chi, b = f.psi === void 0 ? -.5 : f.psi, x = f.sigma === void 0 ? .5 : f.sigma, S, C = d.length, w = Array(C + 1);
|
|
143
|
+
w[0] = d, w[0].fx = e(d), w[0].id = 0;
|
|
144
|
+
for (let f = 0; f < C; ++f) {
|
|
145
|
+
let p = d.slice();
|
|
146
|
+
p[f] = p[f] ? p[f] * m : h, w[f + 1] = p, w[f + 1].fx = e(p), w[f + 1].id = f + 1;
|
|
147
|
+
}
|
|
148
|
+
function E(e) {
|
|
149
|
+
for (let d = 0; d < e.length; d++) w[C][d] = e[d];
|
|
150
|
+
w[C].fx = e.fx;
|
|
151
|
+
}
|
|
152
|
+
let D = (e, d) => e.fx - d.fx, O = d.slice(), k = d.slice(), A = d.slice(), j = d.slice();
|
|
153
|
+
for (let d = 0; d < p; ++d) {
|
|
154
|
+
if (w.sort(D), f.history) {
|
|
155
|
+
let e = w.map((e) => {
|
|
156
|
+
let d = e.slice();
|
|
157
|
+
return d.fx = e.fx, d.id = e.id, d;
|
|
158
|
+
});
|
|
159
|
+
e.sort((e, d) => e.id - d.id), f.history.push({
|
|
160
|
+
x: w[0].slice(),
|
|
161
|
+
fx: w[0].fx,
|
|
162
|
+
simplex: e
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
S = 0;
|
|
166
|
+
for (let e = 0; e < C; ++e) S = Math.max(S, Math.abs(w[0][e] - w[1][e]));
|
|
167
|
+
if (Math.abs(w[0].fx - w[C].fx) < g && S < _) break;
|
|
168
|
+
for (let e = 0; e < C; ++e) {
|
|
169
|
+
O[e] = 0;
|
|
170
|
+
for (let d = 0; d < C; ++d) O[e] += w[d][e];
|
|
171
|
+
O[e] /= C;
|
|
172
|
+
}
|
|
173
|
+
let d = w[C];
|
|
174
|
+
if (weightedSum(k, 1 + v, O, -v, d), k.fx = e(k), k.fx < w[0].fx) weightedSum(j, 1 + y, O, -y, d), j.fx = e(j), j.fx < k.fx ? E(j) : E(k);
|
|
175
|
+
else if (k.fx >= w[C - 1].fx) {
|
|
176
|
+
let f = !1;
|
|
177
|
+
if (k.fx > d.fx ? (weightedSum(A, 1 + b, O, -b, d), A.fx = e(A), A.fx < d.fx ? E(A) : f = !0) : (weightedSum(A, 1 - b * v, O, b * v, d), A.fx = e(A), A.fx < k.fx ? E(A) : f = !0), f) {
|
|
178
|
+
if (x >= 1) break;
|
|
179
|
+
for (let d = 1; d < w.length; ++d) weightedSum(w[d], 1 - x, w[0], x, w[d]), w[d].fx = e(w[d]);
|
|
180
|
+
}
|
|
181
|
+
} else E(k);
|
|
182
|
+
}
|
|
183
|
+
return w.sort(D), {
|
|
184
|
+
fx: w[0].fx,
|
|
185
|
+
x: w[0]
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function wolfeLineSearch(e, d, f, p, m, h, g) {
|
|
189
|
+
let _ = f.fx, v = dot(f.fxprime, d), y = _, b = _, x = v, C = 0;
|
|
190
|
+
m ||= 1, h ||= 1e-6, g ||= .1;
|
|
191
|
+
function w(b, C, w) {
|
|
192
|
+
for (let E = 0; E < 16; ++E) if (m = (b + C) / 2, weightedSum(p.x, 1, f.x, m, d), y = p.fx = e(p.x, p.fxprime), x = dot(p.fxprime, d), y > _ + h * m * v || y >= w) C = m;
|
|
193
|
+
else {
|
|
194
|
+
if (Math.abs(x) <= -g * v) return m;
|
|
195
|
+
x * (C - b) >= 0 && (C = b), b = m, w = y;
|
|
196
|
+
}
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
for (let E = 0; E < 10; ++E) {
|
|
200
|
+
if (weightedSum(p.x, 1, f.x, m, d), y = p.fx = e(p.x, p.fxprime), x = dot(p.fxprime, d), y > _ + h * m * v || E && y >= b) return w(C, m, b);
|
|
201
|
+
if (Math.abs(x) <= -g * v) return m;
|
|
202
|
+
if (x >= 0) return w(m, C, y);
|
|
203
|
+
b = y, C = m, m *= 2;
|
|
204
|
+
}
|
|
205
|
+
return m;
|
|
206
|
+
}
|
|
207
|
+
function conjugateGradient(e, d, f) {
|
|
208
|
+
let p = {
|
|
209
|
+
x: d.slice(),
|
|
210
|
+
fx: 0,
|
|
211
|
+
fxprime: d.slice()
|
|
212
|
+
}, m = {
|
|
213
|
+
x: d.slice(),
|
|
214
|
+
fx: 0,
|
|
215
|
+
fxprime: d.slice()
|
|
216
|
+
}, h = d.slice(), g, _, v = 1, y;
|
|
217
|
+
f ||= {}, y = f.maxIterations || d.length * 20, p.fx = e(p.x, p.fxprime), g = p.fxprime.slice(), scale(g, p.fxprime, -1);
|
|
218
|
+
for (let d = 0; d < y; ++d) {
|
|
219
|
+
if (v = wolfeLineSearch(e, g, p, m, v), f.history && f.history.push({
|
|
220
|
+
x: p.x.slice(),
|
|
221
|
+
fx: p.fx,
|
|
222
|
+
fxprime: p.fxprime.slice(),
|
|
223
|
+
alpha: v
|
|
224
|
+
}), !v) scale(g, p.fxprime, -1);
|
|
225
|
+
else {
|
|
226
|
+
weightedSum(h, 1, m.fxprime, -1, p.fxprime);
|
|
227
|
+
let e = dot(p.fxprime, p.fxprime), d = Math.max(0, dot(h, m.fxprime) / e);
|
|
228
|
+
weightedSum(g, d, g, -1, m.fxprime), _ = p, p = m, m = _;
|
|
229
|
+
}
|
|
230
|
+
if (norm2(p.fxprime) <= 1e-5) break;
|
|
231
|
+
}
|
|
232
|
+
return f.history && f.history.push({
|
|
233
|
+
x: p.x.slice(),
|
|
234
|
+
fx: p.fx,
|
|
235
|
+
fxprime: p.fxprime.slice(),
|
|
236
|
+
alpha: v
|
|
237
|
+
}), p;
|
|
238
|
+
}
|
|
239
|
+
function venn(e, d = {}) {
|
|
240
|
+
d.maxIterations = d.maxIterations || 500;
|
|
241
|
+
let f = d.initialLayout || bestInitialLayout, p = d.lossFunction || lossFunction, m = addMissingAreas(e, d), h = f(m, d), g = Object.keys(h), _ = [];
|
|
242
|
+
for (let e of g) _.push(h[e].x), _.push(h[e].y);
|
|
243
|
+
let v = nelderMead((e) => {
|
|
244
|
+
let d = {};
|
|
245
|
+
for (let f = 0; f < g.length; ++f) {
|
|
246
|
+
let p = g[f];
|
|
247
|
+
d[p] = {
|
|
248
|
+
x: e[2 * f],
|
|
249
|
+
y: e[2 * f + 1],
|
|
250
|
+
radius: h[p].radius
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
return p(d, m);
|
|
254
|
+
}, _, d).x;
|
|
255
|
+
for (let e = 0; e < g.length; ++e) {
|
|
256
|
+
let d = g[e];
|
|
257
|
+
h[d].x = v[2 * e], h[d].y = v[2 * e + 1];
|
|
258
|
+
}
|
|
259
|
+
return h;
|
|
260
|
+
}
|
|
261
|
+
var SMALL = 1e-10;
|
|
262
|
+
function distanceFromIntersectArea(e, d, f) {
|
|
263
|
+
return Math.min(e, d) * Math.min(e, d) * Math.PI <= f + SMALL ? Math.abs(e - d) : bisect((p) => circleOverlap(e, d, p) - f, 0, e + d);
|
|
264
|
+
}
|
|
265
|
+
function addMissingAreas(e, d = {}) {
|
|
266
|
+
let f = d.distinct, p = e.map((e) => Object.assign({}, e));
|
|
267
|
+
function m(e) {
|
|
268
|
+
return e.join(";");
|
|
269
|
+
}
|
|
270
|
+
if (f) {
|
|
271
|
+
let e = /* @__PURE__ */ new Map();
|
|
272
|
+
for (let d of p) for (let f = 0; f < d.sets.length; f++) {
|
|
273
|
+
let p = String(d.sets[f]);
|
|
274
|
+
e.set(p, d.size + (e.get(p) || 0));
|
|
275
|
+
for (let m = f + 1; m < d.sets.length; m++) {
|
|
276
|
+
let f = String(d.sets[m]), h = `${p};${f}`, g = `${f};${p}`;
|
|
277
|
+
e.set(h, d.size + (e.get(h) || 0)), e.set(g, d.size + (e.get(g) || 0));
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
for (let d of p) d.sets.length < 3 && (d.size = e.get(m(d.sets)));
|
|
281
|
+
}
|
|
282
|
+
let h = [], g = /* @__PURE__ */ new Set();
|
|
283
|
+
for (let e of p) if (e.sets.length === 1) h.push(e.sets[0]);
|
|
284
|
+
else if (e.sets.length === 2) {
|
|
285
|
+
let d = e.sets[0], f = e.sets[1];
|
|
286
|
+
g.add(m(e.sets)), g.add(m([f, d]));
|
|
287
|
+
}
|
|
288
|
+
h.sort((e, d) => e === d ? 0 : e < d ? -1 : 1);
|
|
289
|
+
for (let e = 0; e < h.length; ++e) {
|
|
290
|
+
let d = h[e];
|
|
291
|
+
for (let f = e + 1; f < h.length; ++f) {
|
|
292
|
+
let e = h[f];
|
|
293
|
+
g.has(m([d, e])) || p.push({
|
|
294
|
+
sets: [d, e],
|
|
295
|
+
size: 0
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return p;
|
|
300
|
+
}
|
|
301
|
+
function getDistanceMatrices(e, d, f) {
|
|
302
|
+
let p = zerosM(d.length, d.length), m = zerosM(d.length, d.length);
|
|
303
|
+
return e.filter((e) => e.sets.length === 2).forEach((e) => {
|
|
304
|
+
let h = f[e.sets[0]], g = f[e.sets[1]], _ = distanceFromIntersectArea(Math.sqrt(d[h].size / Math.PI), Math.sqrt(d[g].size / Math.PI), e.size);
|
|
305
|
+
p[h][g] = p[g][h] = _;
|
|
306
|
+
let v = 0;
|
|
307
|
+
e.size + 1e-10 >= Math.min(d[h].size, d[g].size) ? v = 1 : e.size <= 1e-10 && (v = -1), m[h][g] = m[g][h] = v;
|
|
308
|
+
}), {
|
|
309
|
+
distances: p,
|
|
310
|
+
constraints: m
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
function constrainedMDSGradient(e, d, f, p) {
|
|
314
|
+
for (let e = 0; e < d.length; ++e) d[e] = 0;
|
|
315
|
+
let m = 0;
|
|
316
|
+
for (let h = 0; h < f.length; ++h) {
|
|
317
|
+
let g = e[2 * h], _ = e[2 * h + 1];
|
|
318
|
+
for (let v = h + 1; v < f.length; ++v) {
|
|
319
|
+
let y = e[2 * v], b = e[2 * v + 1], x = f[h][v], S = p[h][v], C = (y - g) * (y - g) + (b - _) * (b - _), w = Math.sqrt(C), T = C - x * x;
|
|
320
|
+
S > 0 && w <= x || S < 0 && w >= x || (m += 2 * T * T, d[2 * h] += 4 * T * (g - y), d[2 * h + 1] += 4 * T * (_ - b), d[2 * v] += 4 * T * (y - g), d[2 * v + 1] += 4 * T * (b - _));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return m;
|
|
324
|
+
}
|
|
325
|
+
function bestInitialLayout(e, d = {}) {
|
|
326
|
+
let f = greedyLayout(e, d), p = d.lossFunction || lossFunction;
|
|
327
|
+
if (e.length >= 8) {
|
|
328
|
+
let m = constrainedMDSLayout(e, d), h = p(m, e), g = p(f, e);
|
|
329
|
+
h + 1e-8 < g && (f = m);
|
|
330
|
+
}
|
|
331
|
+
return f;
|
|
332
|
+
}
|
|
333
|
+
function constrainedMDSLayout(e, d = {}) {
|
|
334
|
+
let f = d.restarts || 10, p = [], m = {};
|
|
335
|
+
for (let d of e) d.sets.length === 1 && (m[d.sets[0]] = p.length, p.push(d));
|
|
336
|
+
let { distances: h, constraints: g } = getDistanceMatrices(e, p, m), _ = norm2(h.map(norm2)) / h.length;
|
|
337
|
+
h = h.map((e) => e.map((e) => e / _));
|
|
338
|
+
let v = (e, d) => constrainedMDSGradient(e, d, h, g), y = null;
|
|
339
|
+
for (let e = 0; e < f; ++e) {
|
|
340
|
+
let e = conjugateGradient(v, zeros(h.length * 2).map(Math.random), d);
|
|
341
|
+
(!y || e.fx < y.fx) && (y = e);
|
|
342
|
+
}
|
|
343
|
+
let x = y.x, S = {};
|
|
344
|
+
for (let e = 0; e < p.length; ++e) {
|
|
345
|
+
let d = p[e];
|
|
346
|
+
S[d.sets[0]] = {
|
|
347
|
+
x: x[2 * e] * _,
|
|
348
|
+
y: x[2 * e + 1] * _,
|
|
349
|
+
radius: Math.sqrt(d.size / Math.PI)
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
if (d.history) for (let e of d.history) scale(e.x, _);
|
|
353
|
+
return S;
|
|
354
|
+
}
|
|
355
|
+
function greedyLayout(e, d) {
|
|
356
|
+
let f = d && d.lossFunction ? d.lossFunction : lossFunction, p = {}, m = {};
|
|
357
|
+
for (let d of e) if (d.sets.length === 1) {
|
|
358
|
+
let e = d.sets[0];
|
|
359
|
+
p[e] = {
|
|
360
|
+
x: 1e10,
|
|
361
|
+
y: 1e10,
|
|
362
|
+
rowid: p.length,
|
|
363
|
+
size: d.size,
|
|
364
|
+
radius: Math.sqrt(d.size / Math.PI)
|
|
365
|
+
}, m[e] = [];
|
|
366
|
+
}
|
|
367
|
+
e = e.filter((e) => e.sets.length === 2);
|
|
368
|
+
for (let d of e) {
|
|
369
|
+
let e = d.weight == null ? 1 : d.weight, f = d.sets[0], h = d.sets[1];
|
|
370
|
+
d.size + SMALL >= Math.min(p[f].size, p[h].size) && (e = 0), m[f].push({
|
|
371
|
+
set: h,
|
|
372
|
+
size: d.size,
|
|
373
|
+
weight: e
|
|
374
|
+
}), m[h].push({
|
|
375
|
+
set: f,
|
|
376
|
+
size: d.size,
|
|
377
|
+
weight: e
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
let h = [];
|
|
381
|
+
Object.keys(m).forEach((e) => {
|
|
382
|
+
let d = 0;
|
|
383
|
+
for (let f = 0; f < m[e].length; ++f) d += m[e][f].size * m[e][f].weight;
|
|
384
|
+
h.push({
|
|
385
|
+
set: e,
|
|
386
|
+
size: d
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
function g(e, d) {
|
|
390
|
+
return d.size - e.size;
|
|
391
|
+
}
|
|
392
|
+
h.sort(g);
|
|
393
|
+
let v = {};
|
|
394
|
+
function y(e) {
|
|
395
|
+
return e.set in v;
|
|
396
|
+
}
|
|
397
|
+
function b(e, d) {
|
|
398
|
+
p[d].x = e.x, p[d].y = e.y, v[d] = !0;
|
|
399
|
+
}
|
|
400
|
+
b({
|
|
401
|
+
x: 0,
|
|
402
|
+
y: 0
|
|
403
|
+
}, h[0].set);
|
|
404
|
+
for (let d = 1; d < h.length; ++d) {
|
|
405
|
+
let v = h[d].set, S = m[v].filter(y), C = p[v];
|
|
406
|
+
if (S.sort(g), S.length === 0) throw "ERROR: missing pairwise overlap information";
|
|
407
|
+
let w = [];
|
|
408
|
+
for (var x = 0; x < S.length; ++x) {
|
|
409
|
+
let e = p[S[x].set], d = distanceFromIntersectArea(C.radius, e.radius, S[x].size);
|
|
410
|
+
w.push({
|
|
411
|
+
x: e.x + d,
|
|
412
|
+
y: e.y
|
|
413
|
+
}), w.push({
|
|
414
|
+
x: e.x - d,
|
|
415
|
+
y: e.y
|
|
416
|
+
}), w.push({
|
|
417
|
+
y: e.y + d,
|
|
418
|
+
x: e.x
|
|
419
|
+
}), w.push({
|
|
420
|
+
y: e.y - d,
|
|
421
|
+
x: e.x
|
|
422
|
+
});
|
|
423
|
+
for (let f = x + 1; f < S.length; ++f) {
|
|
424
|
+
let m = p[S[f].set], h = distanceFromIntersectArea(C.radius, m.radius, S[f].size), g = circleCircleIntersection({
|
|
425
|
+
x: e.x,
|
|
426
|
+
y: e.y,
|
|
427
|
+
radius: d
|
|
428
|
+
}, {
|
|
429
|
+
x: m.x,
|
|
430
|
+
y: m.y,
|
|
431
|
+
radius: h
|
|
432
|
+
});
|
|
433
|
+
w.push(...g);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
let T = 1e50, E = w[0];
|
|
437
|
+
for (let d of w) {
|
|
438
|
+
p[v].x = d.x, p[v].y = d.y;
|
|
439
|
+
let m = f(p, e);
|
|
440
|
+
m < T && (T = m, E = d);
|
|
441
|
+
}
|
|
442
|
+
b(E, v);
|
|
443
|
+
}
|
|
444
|
+
return p;
|
|
445
|
+
}
|
|
446
|
+
function lossFunction(e, f) {
|
|
447
|
+
let p = 0;
|
|
448
|
+
for (let m of f) {
|
|
449
|
+
if (m.sets.length === 1) continue;
|
|
450
|
+
let f;
|
|
451
|
+
if (m.sets.length === 2) {
|
|
452
|
+
let d = e[m.sets[0]], p = e[m.sets[1]];
|
|
453
|
+
f = circleOverlap(d.radius, p.radius, distance(d, p));
|
|
454
|
+
} else f = intersectionArea(m.sets.map((d) => e[d]));
|
|
455
|
+
let _ = m.weight == null ? 1 : m.weight;
|
|
456
|
+
p += _ * (f - m.size) * (f - m.size);
|
|
457
|
+
}
|
|
458
|
+
return p;
|
|
459
|
+
}
|
|
460
|
+
function logRatioLossFunction(e, f) {
|
|
461
|
+
let p = 0;
|
|
462
|
+
for (let m of f) {
|
|
463
|
+
if (m.sets.length === 1) continue;
|
|
464
|
+
let f;
|
|
465
|
+
if (m.sets.length === 2) {
|
|
466
|
+
let d = e[m.sets[0]], p = e[m.sets[1]];
|
|
467
|
+
f = circleOverlap(d.radius, p.radius, distance(d, p));
|
|
468
|
+
} else f = intersectionArea(m.sets.map((d) => e[d]));
|
|
469
|
+
let _ = m.weight == null ? 1 : m.weight, v = Math.log((f + 1) / (m.size + 1));
|
|
470
|
+
p += _ * v * v;
|
|
471
|
+
}
|
|
472
|
+
return p;
|
|
473
|
+
}
|
|
474
|
+
function orientateCircles(e, d, f) {
|
|
475
|
+
if (f == null ? e.sort((e, d) => d.radius - e.radius) : e.sort(f), e.length > 0) {
|
|
476
|
+
let d = e[0].x, f = e[0].y;
|
|
477
|
+
for (let p of e) p.x -= d, p.y -= f;
|
|
478
|
+
}
|
|
479
|
+
if (e.length === 2 && distance(e[0], e[1]) < Math.abs(e[1].radius - e[0].radius) && (e[1].x = e[0].x + e[0].radius - e[1].radius - 1e-10, e[1].y = e[0].y), e.length > 1) {
|
|
480
|
+
let f = Math.atan2(e[1].x, e[1].y) - d, p = Math.cos(f), m = Math.sin(f);
|
|
481
|
+
for (let d of e) {
|
|
482
|
+
let e = d.x, f = d.y;
|
|
483
|
+
d.x = p * e - m * f, d.y = m * e + p * f;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
if (e.length > 2) {
|
|
487
|
+
let f = Math.atan2(e[2].x, e[2].y) - d;
|
|
488
|
+
for (; f < 0;) f += 2 * Math.PI;
|
|
489
|
+
for (; f > 2 * Math.PI;) f -= 2 * Math.PI;
|
|
490
|
+
if (f > Math.PI) {
|
|
491
|
+
let d = e[1].y / (1e-10 + e[1].x);
|
|
492
|
+
for (let f of e) {
|
|
493
|
+
var p = (f.x + d * f.y) / (1 + d * d);
|
|
494
|
+
f.x = 2 * p - f.x, f.y = 2 * p * d - f.y;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
function disjointCluster(e) {
|
|
500
|
+
e.forEach((e) => {
|
|
501
|
+
e.parent = e;
|
|
502
|
+
});
|
|
503
|
+
function d(e) {
|
|
504
|
+
return e.parent !== e && (e.parent = d(e.parent)), e.parent;
|
|
505
|
+
}
|
|
506
|
+
function f(e, f) {
|
|
507
|
+
let p = d(e);
|
|
508
|
+
p.parent = d(f);
|
|
509
|
+
}
|
|
510
|
+
for (let d = 0; d < e.length; ++d) for (let p = d + 1; p < e.length; ++p) {
|
|
511
|
+
let m = e[d].radius + e[p].radius;
|
|
512
|
+
distance(e[d], e[p]) + 1e-10 < m && f(e[p], e[d]);
|
|
513
|
+
}
|
|
514
|
+
let p = /* @__PURE__ */ new Map();
|
|
515
|
+
for (let f = 0; f < e.length; ++f) {
|
|
516
|
+
let m = d(e[f]).parent.setid;
|
|
517
|
+
p.has(m) || p.set(m, []), p.get(m).push(e[f]);
|
|
518
|
+
}
|
|
519
|
+
return e.forEach((e) => {
|
|
520
|
+
delete e.parent;
|
|
521
|
+
}), Array.from(p.values());
|
|
522
|
+
}
|
|
523
|
+
function getBoundingBox(e) {
|
|
524
|
+
let d = (d) => ({
|
|
525
|
+
max: e.reduce((e, f) => Math.max(e, f[d] + f.radius), -Infinity),
|
|
526
|
+
min: e.reduce((e, f) => Math.min(e, f[d] - f.radius), Infinity)
|
|
527
|
+
});
|
|
528
|
+
return {
|
|
529
|
+
xRange: d("x"),
|
|
530
|
+
yRange: d("y")
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
function normalizeSolution(e, d, f) {
|
|
534
|
+
d ??= Math.PI / 2;
|
|
535
|
+
let p = fromObjectNotation(e).map((e) => Object.assign({}, e)), m = disjointCluster(p);
|
|
536
|
+
for (let e of m) {
|
|
537
|
+
orientateCircles(e, d, f);
|
|
538
|
+
let p = getBoundingBox(e);
|
|
539
|
+
e.size = (p.xRange.max - p.xRange.min) * (p.yRange.max - p.yRange.min), e.bounds = p;
|
|
540
|
+
}
|
|
541
|
+
m.sort((e, d) => d.size - e.size), p = m[0];
|
|
542
|
+
let h = p.bounds, g = (h.xRange.max - h.xRange.min) / 50;
|
|
543
|
+
function _(e, d, f) {
|
|
544
|
+
if (!e) return;
|
|
545
|
+
let m = e.bounds, _, v;
|
|
546
|
+
if (d) _ = h.xRange.max - m.xRange.min + g;
|
|
547
|
+
else {
|
|
548
|
+
_ = h.xRange.max - m.xRange.max;
|
|
549
|
+
let e = (m.xRange.max - m.xRange.min) / 2 - (h.xRange.max - h.xRange.min) / 2;
|
|
550
|
+
e < 0 && (_ += e);
|
|
551
|
+
}
|
|
552
|
+
if (f) v = h.yRange.max - m.yRange.min + g;
|
|
553
|
+
else {
|
|
554
|
+
v = h.yRange.max - m.yRange.max;
|
|
555
|
+
let e = (m.yRange.max - m.yRange.min) / 2 - (h.yRange.max - h.yRange.min) / 2;
|
|
556
|
+
e < 0 && (v += e);
|
|
557
|
+
}
|
|
558
|
+
for (let d of e) d.x += _, d.y += v, p.push(d);
|
|
559
|
+
}
|
|
560
|
+
let v = 1;
|
|
561
|
+
for (; v < m.length;) _(m[v], !0, !1), _(m[v + 1], !1, !0), _(m[v + 2], !0, !0), v += 3, h = getBoundingBox(p);
|
|
562
|
+
return toObjectNotation(p);
|
|
563
|
+
}
|
|
564
|
+
function scaleSolution(e, d, f, p, m) {
|
|
565
|
+
let h = fromObjectNotation(e);
|
|
566
|
+
d -= 2 * p, f -= 2 * p;
|
|
567
|
+
let { xRange: g, yRange: _ } = getBoundingBox(h);
|
|
568
|
+
if (g.max === g.min || _.max === _.min) return console.log("not scaling solution: zero size detected"), e;
|
|
569
|
+
let v, y;
|
|
570
|
+
if (m) {
|
|
571
|
+
let e = Math.sqrt(m / Math.PI) * 2;
|
|
572
|
+
v = d / e, y = f / e;
|
|
573
|
+
} else v = d / (g.max - g.min), y = f / (_.max - _.min);
|
|
574
|
+
let b = Math.min(y, v), x = (d - (g.max - g.min) * b) / 2, S = (f - (_.max - _.min) * b) / 2;
|
|
575
|
+
return toObjectNotation(h.map((e) => ({
|
|
576
|
+
radius: b * e.radius,
|
|
577
|
+
x: p + x + (e.x - g.min) * b,
|
|
578
|
+
y: p + S + (e.y - _.min) * b,
|
|
579
|
+
setid: e.setid
|
|
580
|
+
})));
|
|
581
|
+
}
|
|
582
|
+
function toObjectNotation(e) {
|
|
583
|
+
let d = {};
|
|
584
|
+
for (let f of e) d[f.setid] = f;
|
|
585
|
+
return d;
|
|
586
|
+
}
|
|
587
|
+
function fromObjectNotation(e) {
|
|
588
|
+
return Object.keys(e).map((d) => Object.assign(e[d], { setid: d }));
|
|
589
|
+
}
|
|
590
|
+
function VennDiagram(e = {}) {
|
|
591
|
+
let d = !1, f = 600, p = 350, m = 15, h = 1e3, g = Math.PI / 2, _ = !0, v = null, y = !0, b = !0, x = null, S = null, C = !1, w = null, T = e && e.symmetricalTextCentre ? e.symmetricalTextCentre : !1, E = {}, D = e && e.colourScheme ? e.colourScheme : e && e.colorScheme ? e.colorScheme : [
|
|
592
|
+
"#1f77b4",
|
|
593
|
+
"#ff7f0e",
|
|
594
|
+
"#2ca02c",
|
|
595
|
+
"#d62728",
|
|
596
|
+
"#9467bd",
|
|
597
|
+
"#8c564b",
|
|
598
|
+
"#e377c2",
|
|
599
|
+
"#7f7f7f",
|
|
600
|
+
"#bcbd22",
|
|
601
|
+
"#17becf"
|
|
602
|
+
], O = 0, A = function(e) {
|
|
603
|
+
if (e in E) return E[e];
|
|
604
|
+
var d = E[e] = D[O];
|
|
605
|
+
return O += 1, O >= D.length && (O = 0), d;
|
|
606
|
+
}, j = venn, M = lossFunction;
|
|
607
|
+
function N(E) {
|
|
608
|
+
let D = E.datum(), O = /* @__PURE__ */ new Set();
|
|
609
|
+
D.forEach((e) => {
|
|
610
|
+
e.size == 0 && e.sets.length == 1 && O.add(e.sets[0]);
|
|
611
|
+
}), D = D.filter((e) => !e.sets.some((e) => O.has(e)));
|
|
612
|
+
let k = {}, N = {};
|
|
613
|
+
if (D.length > 0) {
|
|
614
|
+
let e = j(D, {
|
|
615
|
+
lossFunction: M,
|
|
616
|
+
distinct: C
|
|
617
|
+
});
|
|
618
|
+
_ && (e = normalizeSolution(e, g, S)), k = scaleSolution(e, f, p, m, v), N = computeTextCentres(k, D, T);
|
|
619
|
+
}
|
|
620
|
+
let P = {};
|
|
621
|
+
D.forEach((e) => {
|
|
622
|
+
e.label && (P[e.sets] = e.label);
|
|
623
|
+
});
|
|
624
|
+
function F(e) {
|
|
625
|
+
if (e.sets in P) return P[e.sets];
|
|
626
|
+
if (e.sets.length == 1) return "" + e.sets[0];
|
|
627
|
+
}
|
|
628
|
+
E.selectAll("svg").data([k]).enter().append("svg");
|
|
629
|
+
let I = E.select("svg");
|
|
630
|
+
d ? I.attr("viewBox", `0 0 ${f} ${p}`) : I.attr("width", f).attr("height", p);
|
|
631
|
+
let L = {}, R = !1;
|
|
632
|
+
I.selectAll(".venn-area path").each(function(e) {
|
|
633
|
+
let d = this.getAttribute("d");
|
|
634
|
+
e.sets.length == 1 && d && !C && (R = !0, L[e.sets[0]] = circleFromPath(d));
|
|
635
|
+
});
|
|
636
|
+
function z(e) {
|
|
637
|
+
return (d) => intersectionAreaPath(e.sets.map((e) => {
|
|
638
|
+
let m = L[e], h = k[e];
|
|
639
|
+
return m ||= {
|
|
640
|
+
x: f / 2,
|
|
641
|
+
y: p / 2,
|
|
642
|
+
radius: 1
|
|
643
|
+
}, h ||= {
|
|
644
|
+
x: f / 2,
|
|
645
|
+
y: p / 2,
|
|
646
|
+
radius: 1
|
|
647
|
+
}, {
|
|
648
|
+
x: m.x * (1 - d) + h.x * d,
|
|
649
|
+
y: m.y * (1 - d) + h.y * d,
|
|
650
|
+
radius: m.radius * (1 - d) + h.radius * d
|
|
651
|
+
};
|
|
652
|
+
}), w);
|
|
653
|
+
}
|
|
654
|
+
let B = I.selectAll(".venn-area").data(D, (e) => e.sets), V = B.enter().append("g").attr("class", (e) => `venn-area venn-${e.sets.length == 1 ? "circle" : "intersection"}${e.colour || e.color ? " venn-coloured" : ""}`).attr("data-venn-sets", (e) => e.sets.join("_")), H = V.append("path"), U = V.append("text").attr("class", "label").text((e) => F(e)).attr("text-anchor", "middle").attr("dy", ".35em").attr("x", f / 2).attr("y", p / 2);
|
|
655
|
+
b && (H.style("fill-opacity", "0").filter((e) => e.sets.length == 1).style("fill", (e) => e.colour ? e.colour : e.color ? e.color : A(e.sets)).style("fill-opacity", ".25"), U.style("fill", (d) => d.colour || d.color ? "#FFF" : e.textFill ? e.textFill : d.sets.length == 1 ? A(d.sets) : "#444"));
|
|
656
|
+
function W(e) {
|
|
657
|
+
return typeof e.transition == "function" ? e.transition("venn").duration(h) : e;
|
|
658
|
+
}
|
|
659
|
+
let G = E;
|
|
660
|
+
R && typeof G.transition == "function" ? (G = W(E), G.selectAll("path").attrTween("d", z)) : G.selectAll("path").attr("d", (e) => intersectionAreaPath(e.sets.map((e) => k[e])), w);
|
|
661
|
+
let K = G.selectAll("text").filter((e) => e.sets in N).text((e) => F(e)).attr("x", (e) => Math.floor(N[e.sets].x)).attr("y", (e) => Math.floor(N[e.sets].y));
|
|
662
|
+
y && (R ? "on" in K ? K.on("end", wrapText(k, F)) : K.each("end", wrapText(k, F)) : K.each(wrapText(k, F)));
|
|
663
|
+
let q = W(B.exit()).remove();
|
|
664
|
+
typeof B.transition == "function" && q.selectAll("path").attrTween("d", z);
|
|
665
|
+
let J = q.selectAll("text").attr("x", f / 2).attr("y", p / 2);
|
|
666
|
+
return x !== null && (U.style("font-size", "0px"), K.style("font-size", x), J.style("font-size", "0px")), {
|
|
667
|
+
circles: k,
|
|
668
|
+
textCentres: N,
|
|
669
|
+
nodes: B,
|
|
670
|
+
enter: V,
|
|
671
|
+
update: G,
|
|
672
|
+
exit: q
|
|
673
|
+
};
|
|
674
|
+
}
|
|
675
|
+
return N.wrap = function(e) {
|
|
676
|
+
return arguments.length ? (y = e, N) : y;
|
|
677
|
+
}, N.useViewBox = function() {
|
|
678
|
+
return d = !0, N;
|
|
679
|
+
}, N.width = function(e) {
|
|
680
|
+
return arguments.length ? (f = e, N) : f;
|
|
681
|
+
}, N.height = function(e) {
|
|
682
|
+
return arguments.length ? (p = e, N) : p;
|
|
683
|
+
}, N.padding = function(e) {
|
|
684
|
+
return arguments.length ? (m = e, N) : m;
|
|
685
|
+
}, N.distinct = function(e) {
|
|
686
|
+
return arguments.length ? (C = e, N) : C;
|
|
687
|
+
}, N.colours = function(e) {
|
|
688
|
+
return arguments.length ? (A = e, N) : A;
|
|
689
|
+
}, N.colors = function(e) {
|
|
690
|
+
return arguments.length ? (A = e, N) : A;
|
|
691
|
+
}, N.fontSize = function(e) {
|
|
692
|
+
return arguments.length ? (x = e, N) : x;
|
|
693
|
+
}, N.round = function(e) {
|
|
694
|
+
return arguments.length ? (w = e, N) : w;
|
|
695
|
+
}, N.duration = function(e) {
|
|
696
|
+
return arguments.length ? (h = e, N) : h;
|
|
697
|
+
}, N.layoutFunction = function(e) {
|
|
698
|
+
return arguments.length ? (j = e, N) : j;
|
|
699
|
+
}, N.normalize = function(e) {
|
|
700
|
+
return arguments.length ? (_ = e, N) : _;
|
|
701
|
+
}, N.scaleToFit = function(e) {
|
|
702
|
+
return arguments.length ? (v = e, N) : v;
|
|
703
|
+
}, N.styled = function(e) {
|
|
704
|
+
return arguments.length ? (b = e, N) : b;
|
|
705
|
+
}, N.orientation = function(e) {
|
|
706
|
+
return arguments.length ? (g = e, N) : g;
|
|
707
|
+
}, N.orientationOrder = function(e) {
|
|
708
|
+
return arguments.length ? (S = e, N) : S;
|
|
709
|
+
}, N.lossFunction = function(e) {
|
|
710
|
+
return arguments.length ? (M = e === "default" ? lossFunction : e === "logRatio" ? logRatioLossFunction : e, N) : M;
|
|
711
|
+
}, N;
|
|
712
|
+
}
|
|
713
|
+
function wrapText(e, d) {
|
|
714
|
+
return function(f) {
|
|
715
|
+
let p = this, m = e[f.sets[0]].radius || 50, h = d(f) || "", g = h.split(/\s+/).reverse(), _ = (h.length + g.length) / 3, v = g.pop(), y = [v], b = 0, x = 1.1;
|
|
716
|
+
p.textContent = null;
|
|
717
|
+
let S = [];
|
|
718
|
+
function C(e) {
|
|
719
|
+
let d = p.ownerDocument.createElementNS(p.namespaceURI, "tspan");
|
|
720
|
+
return d.textContent = e, S.push(d), p.append(d), d;
|
|
721
|
+
}
|
|
722
|
+
let w = C(v);
|
|
723
|
+
for (; v = g.pop(), v;) {
|
|
724
|
+
y.push(v);
|
|
725
|
+
let e = y.join(" ");
|
|
726
|
+
w.textContent = e, e.length > _ && w.getComputedTextLength() > m && (y.pop(), w.textContent = y.join(" "), y = [v], w = C(v), b++);
|
|
727
|
+
}
|
|
728
|
+
let T = .35 - b * x / 2, E = p.getAttribute("x"), D = p.getAttribute("y");
|
|
729
|
+
S.forEach((e, d) => {
|
|
730
|
+
e.setAttribute("x", E), e.setAttribute("y", D), e.setAttribute("dy", `${T + d * x}em`);
|
|
731
|
+
});
|
|
732
|
+
};
|
|
733
|
+
}
|
|
734
|
+
function circleMargin(e, d, f) {
|
|
735
|
+
let p = d[0].radius - distance(d[0], e);
|
|
736
|
+
for (let f = 1; f < d.length; ++f) {
|
|
737
|
+
let m = d[f].radius - distance(d[f], e);
|
|
738
|
+
m <= p && (p = m);
|
|
739
|
+
}
|
|
740
|
+
for (let d = 0; d < f.length; ++d) {
|
|
741
|
+
let m = distance(f[d], e) - f[d].radius;
|
|
742
|
+
m <= p && (p = m);
|
|
743
|
+
}
|
|
744
|
+
return p;
|
|
745
|
+
}
|
|
746
|
+
function computeTextCentre(e, f, p) {
|
|
747
|
+
let m = [];
|
|
748
|
+
for (let d of e) m.push({
|
|
749
|
+
x: d.x,
|
|
750
|
+
y: d.y
|
|
751
|
+
}), m.push({
|
|
752
|
+
x: d.x + d.radius / 2,
|
|
753
|
+
y: d.y
|
|
754
|
+
}), m.push({
|
|
755
|
+
x: d.x - d.radius / 2,
|
|
756
|
+
y: d.y
|
|
757
|
+
}), m.push({
|
|
758
|
+
x: d.x,
|
|
759
|
+
y: d.y + d.radius / 2
|
|
760
|
+
}), m.push({
|
|
761
|
+
x: d.x,
|
|
762
|
+
y: d.y - d.radius / 2
|
|
763
|
+
});
|
|
764
|
+
let g = m[0], _ = circleMargin(m[0], e, f);
|
|
765
|
+
for (let d = 1; d < m.length; ++d) {
|
|
766
|
+
let p = circleMargin(m[d], e, f);
|
|
767
|
+
p >= _ && (g = m[d], _ = p);
|
|
768
|
+
}
|
|
769
|
+
let y = nelderMead((d) => -1 * circleMargin({
|
|
770
|
+
x: d[0],
|
|
771
|
+
y: d[1]
|
|
772
|
+
}, e, f), [g.x, g.y], {
|
|
773
|
+
maxIterations: 500,
|
|
774
|
+
minErrorDelta: 1e-10
|
|
775
|
+
}).x, b = {
|
|
776
|
+
x: p ? 0 : y[0],
|
|
777
|
+
y: y[1]
|
|
778
|
+
}, x = !0;
|
|
779
|
+
for (let d of e) if (distance(b, d) > d.radius) {
|
|
780
|
+
x = !1;
|
|
781
|
+
break;
|
|
782
|
+
}
|
|
783
|
+
for (let e of f) if (distance(b, e) < e.radius) {
|
|
784
|
+
x = !1;
|
|
785
|
+
break;
|
|
786
|
+
}
|
|
787
|
+
if (x) return b;
|
|
788
|
+
if (e.length == 1) return {
|
|
789
|
+
x: e[0].x,
|
|
790
|
+
y: e[0].y
|
|
791
|
+
};
|
|
792
|
+
let S = {};
|
|
793
|
+
return intersectionArea(e, S), S.arcs.length === 0 ? {
|
|
794
|
+
x: 0,
|
|
795
|
+
y: -1e3,
|
|
796
|
+
disjoint: !0
|
|
797
|
+
} : S.arcs.length == 1 ? {
|
|
798
|
+
x: S.arcs[0].circle.x,
|
|
799
|
+
y: S.arcs[0].circle.y
|
|
800
|
+
} : f.length ? computeTextCentre(e, []) : getCenter(S.arcs.map((e) => e.p1));
|
|
801
|
+
}
|
|
802
|
+
function getOverlappingCircles(e) {
|
|
803
|
+
let d = {}, f = Object.keys(e);
|
|
804
|
+
for (let e of f) d[e] = [];
|
|
805
|
+
for (let p = 0; p < f.length; p++) {
|
|
806
|
+
let m = f[p], g = e[m];
|
|
807
|
+
for (let _ = p + 1; _ < f.length; ++_) {
|
|
808
|
+
let p = f[_], v = e[p], y = distance(g, v);
|
|
809
|
+
y + v.radius <= g.radius + 1e-10 ? d[p].push(m) : y + g.radius <= v.radius + 1e-10 && d[m].push(p);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
return d;
|
|
813
|
+
}
|
|
814
|
+
function computeTextCentres(e, d, f) {
|
|
815
|
+
let p = {}, m = getOverlappingCircles(e);
|
|
816
|
+
for (let h = 0; h < d.length; ++h) {
|
|
817
|
+
let g = d[h].sets, _ = {}, v = {};
|
|
818
|
+
for (let e = 0; e < g.length; ++e) {
|
|
819
|
+
_[g[e]] = !0;
|
|
820
|
+
let d = m[g[e]];
|
|
821
|
+
for (let e = 0; e < d.length; ++e) v[d[e]] = !0;
|
|
822
|
+
}
|
|
823
|
+
let y = [], b = [];
|
|
824
|
+
for (let d in e) d in _ ? y.push(e[d]) : d in v || b.push(e[d]);
|
|
825
|
+
let x = computeTextCentre(y, b, f);
|
|
826
|
+
p[g] = x, x.disjoint && d[h].size > 0 && console.log("WARNING: area " + g + " not represented on screen");
|
|
827
|
+
}
|
|
828
|
+
return p;
|
|
829
|
+
}
|
|
830
|
+
function circlePath(e, d, f) {
|
|
831
|
+
let p = [];
|
|
832
|
+
return p.push("\nM", e, d), p.push("\nm", -f, 0), p.push("\na", f, f, 0, 1, 0, f * 2, 0), p.push("\na", f, f, 0, 1, 0, -f * 2, 0), p.join(" ");
|
|
833
|
+
}
|
|
834
|
+
function circleFromPath(e) {
|
|
835
|
+
let d = e.split(" ");
|
|
836
|
+
return {
|
|
837
|
+
x: Number.parseFloat(d[1]),
|
|
838
|
+
y: Number.parseFloat(d[2]),
|
|
839
|
+
radius: -Number.parseFloat(d[4])
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
function intersectionAreaArcs(e) {
|
|
843
|
+
if (e.length === 0) return [];
|
|
844
|
+
let f = {};
|
|
845
|
+
return intersectionArea(e, f), f.arcs;
|
|
846
|
+
}
|
|
847
|
+
function arcsToPath(e, d) {
|
|
848
|
+
if (e.length === 0) return "M 0 0";
|
|
849
|
+
let f = 10 ** (d || 0), p = d == null ? (e) => e : (e) => Math.round(e * f) / f;
|
|
850
|
+
if (e.length == 1) {
|
|
851
|
+
let d = e[0].circle;
|
|
852
|
+
return circlePath(p(d.x), p(d.y), p(d.radius));
|
|
853
|
+
}
|
|
854
|
+
let m = [
|
|
855
|
+
"\nM",
|
|
856
|
+
p(e[0].p2.x),
|
|
857
|
+
p(e[0].p2.y)
|
|
858
|
+
];
|
|
859
|
+
for (let d of e) {
|
|
860
|
+
let e = p(d.circle.radius);
|
|
861
|
+
m.push("\nA", e, e, 0, d.large ? 1 : 0, d.sweep ? 1 : 0, p(d.p1.x), p(d.p1.y));
|
|
862
|
+
}
|
|
863
|
+
return m.join(" ");
|
|
864
|
+
}
|
|
865
|
+
function intersectionAreaPath(e, d) {
|
|
866
|
+
return arcsToPath(intersectionAreaArcs(e), d);
|
|
867
|
+
}
|
|
868
|
+
function layout(e, d = {}) {
|
|
869
|
+
let { lossFunction: f, layoutFunction: p = venn, normalize: m = !0, orientation: h = Math.PI / 2, orientationOrder: g, width: _ = 600, height: v = 350, padding: y = 15, scaleToFit: b = !1, symmetricalTextCentre: x = !1, distinct: S, round: C = 2 } = d, w = p(e, {
|
|
870
|
+
lossFunction: f === "default" || !f ? lossFunction : f === "logRatio" ? logRatioLossFunction : f,
|
|
871
|
+
distinct: S
|
|
872
|
+
});
|
|
873
|
+
m && (w = normalizeSolution(w, h, g));
|
|
874
|
+
let T = scaleSolution(w, _, v, y, b), E = computeTextCentres(T, e, x), D = new Map(Object.keys(T).map((e) => [e, {
|
|
875
|
+
set: e,
|
|
876
|
+
x: T[e].x,
|
|
877
|
+
y: T[e].y,
|
|
878
|
+
radius: T[e].radius
|
|
879
|
+
}])), O = e.map((e) => {
|
|
880
|
+
let d = e.sets.map((e) => D.get(e)), f = intersectionAreaArcs(d);
|
|
881
|
+
return {
|
|
882
|
+
circles: d,
|
|
883
|
+
arcs: f,
|
|
884
|
+
path: arcsToPath(f, C),
|
|
885
|
+
area: e,
|
|
886
|
+
has: new Set(e.sets)
|
|
887
|
+
};
|
|
888
|
+
});
|
|
889
|
+
function A(e) {
|
|
890
|
+
let d = "";
|
|
891
|
+
for (let f of O) f.has.size > e.length && e.every((e) => f.has.has(e)) && (d += " " + f.path);
|
|
892
|
+
return d;
|
|
893
|
+
}
|
|
894
|
+
return O.map(({ circles: e, arcs: d, path: f, area: p }) => ({
|
|
895
|
+
data: p,
|
|
896
|
+
text: E[p.sets],
|
|
897
|
+
circles: e,
|
|
898
|
+
arcs: d,
|
|
899
|
+
path: f,
|
|
900
|
+
distinctPath: f + A(p.sets)
|
|
901
|
+
}));
|
|
902
|
+
}
|
|
903
|
+
export { VennDiagram, layout };
|