@graphty/graph-samples 0.0.1 → 0.1.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/LICENSE +21 -0
- package/NOTICE +123 -0
- package/README.md +190 -1
- package/dist/chunks/build-DdCe60t3.js +47 -0
- package/dist/chunks/build-DdCe60t3.js.map +1 -0
- package/dist/chunks/meta-B6toBzaa.js +19 -0
- package/dist/chunks/meta-B6toBzaa.js.map +1 -0
- package/dist/chunks/meta-BM_YIhlA.js +28 -0
- package/dist/chunks/meta-BM_YIhlA.js.map +1 -0
- package/dist/chunks/meta-BMmtUpPx.js +30 -0
- package/dist/chunks/meta-BMmtUpPx.js.map +1 -0
- package/dist/chunks/meta-BXC7oi86.js +22 -0
- package/dist/chunks/meta-BXC7oi86.js.map +1 -0
- package/dist/chunks/meta-BaFPvhc1.js +19 -0
- package/dist/chunks/meta-BaFPvhc1.js.map +1 -0
- package/dist/chunks/meta-C58v1Oy0.js +28 -0
- package/dist/chunks/meta-C58v1Oy0.js.map +1 -0
- package/dist/chunks/meta-CQRXyexG.js +23 -0
- package/dist/chunks/meta-CQRXyexG.js.map +1 -0
- package/dist/chunks/meta-DrgM1eS0.js +23 -0
- package/dist/chunks/meta-DrgM1eS0.js.map +1 -0
- package/dist/chunks/meta-IhoaDXAV.js +19 -0
- package/dist/chunks/meta-IhoaDXAV.js.map +1 -0
- package/dist/chunks/meta-MQPbBUUB.js +29 -0
- package/dist/chunks/meta-MQPbBUUB.js.map +1 -0
- package/dist/chunks/meta-Qp4HNYAZ.js +24 -0
- package/dist/chunks/meta-Qp4HNYAZ.js.map +1 -0
- package/dist/chunks/meta-mns0uFIW.js +19 -0
- package/dist/chunks/meta-mns0uFIW.js.map +1 -0
- package/dist/datasets/celegans-neural.d.ts +1 -0
- package/dist/datasets/celegans-neural.js +7359 -0
- package/dist/datasets/celegans-neural.js.map +1 -0
- package/dist/datasets/contiguous-usa.d.ts +1 -0
- package/dist/datasets/contiguous-usa.js +501 -0
- package/dist/datasets/contiguous-usa.js.map +1 -0
- package/dist/datasets/davis-southern-women.d.ts +1 -0
- package/dist/datasets/davis-southern-women.js +235 -0
- package/dist/datasets/davis-southern-women.js.map +1 -0
- package/dist/datasets/dolphins.d.ts +1 -0
- package/dist/datasets/dolphins.js +406 -0
- package/dist/datasets/dolphins.js.map +1 -0
- package/dist/datasets/florentine-families.d.ts +1 -0
- package/dist/datasets/florentine-families.js +75 -0
- package/dist/datasets/florentine-families.js.map +1 -0
- package/dist/datasets/football.d.ts +1 -0
- package/dist/datasets/football.js +1508 -0
- package/dist/datasets/football.js.map +1 -0
- package/dist/datasets/karate.d.ts +1 -0
- package/dist/datasets/karate.js +295 -0
- package/dist/datasets/karate.js.map +1 -0
- package/dist/datasets/knuth-miles.d.ts +1 -0
- package/dist/datasets/knuth-miles.js +24933 -0
- package/dist/datasets/knuth-miles.js.map +1 -0
- package/dist/datasets/les-miserables.d.ts +1 -0
- package/dist/datasets/les-miserables.js +860 -0
- package/dist/datasets/les-miserables.js.map +1 -0
- package/dist/datasets/openflights.d.ts +1 -0
- package/dist/datasets/openflights.js +130277 -0
- package/dist/datasets/openflights.js.map +1 -0
- package/dist/datasets/political-blogs.d.ts +1 -0
- package/dist/datasets/political-blogs.js +42551 -0
- package/dist/datasets/political-blogs.js.map +1 -0
- package/dist/datasets/political-books.d.ts +1 -0
- package/dist/datasets/political-books.js +1124 -0
- package/dist/datasets/political-books.js.map +1 -0
- package/dist/generators.d.ts +1 -0
- package/dist/generators.js +4496 -0
- package/dist/generators.js.map +1 -0
- package/dist/graph-samples.d.ts +1 -0
- package/dist/graph-samples.js +142 -0
- package/dist/graph-samples.js.map +1 -0
- package/dist/src/datasets/build.d.ts +89 -0
- package/dist/src/datasets/build.d.ts.map +1 -0
- package/dist/src/datasets/build.js +53 -0
- package/dist/src/datasets/build.js.map +1 -0
- package/dist/src/datasets/catalog.d.ts +8 -0
- package/dist/src/datasets/catalog.d.ts.map +1 -0
- package/dist/src/datasets/catalog.js +34 -0
- package/dist/src/datasets/catalog.js.map +1 -0
- package/dist/src/datasets/celegans-neural/data.d.ts +3 -0
- package/dist/src/datasets/celegans-neural/data.d.ts.map +1 -0
- package/dist/src/datasets/celegans-neural/data.js +573 -0
- package/dist/src/datasets/celegans-neural/data.js.map +1 -0
- package/dist/src/datasets/celegans-neural/index.d.ts +11 -0
- package/dist/src/datasets/celegans-neural/index.d.ts.map +1 -0
- package/dist/src/datasets/celegans-neural/index.js +14 -0
- package/dist/src/datasets/celegans-neural/index.js.map +1 -0
- package/dist/src/datasets/celegans-neural/meta.d.ts +4 -0
- package/dist/src/datasets/celegans-neural/meta.d.ts.map +1 -0
- package/dist/src/datasets/celegans-neural/meta.js +21 -0
- package/dist/src/datasets/celegans-neural/meta.js.map +1 -0
- package/dist/src/datasets/contiguous-usa/data.d.ts +3 -0
- package/dist/src/datasets/contiguous-usa/data.d.ts.map +1 -0
- package/dist/src/datasets/contiguous-usa/data.js +162 -0
- package/dist/src/datasets/contiguous-usa/data.js.map +1 -0
- package/dist/src/datasets/contiguous-usa/index.d.ts +11 -0
- package/dist/src/datasets/contiguous-usa/index.d.ts.map +1 -0
- package/dist/src/datasets/contiguous-usa/index.js +14 -0
- package/dist/src/datasets/contiguous-usa/index.js.map +1 -0
- package/dist/src/datasets/contiguous-usa/meta.d.ts +4 -0
- package/dist/src/datasets/contiguous-usa/meta.d.ts.map +1 -0
- package/dist/src/datasets/contiguous-usa/meta.js +27 -0
- package/dist/src/datasets/contiguous-usa/meta.js.map +1 -0
- package/dist/src/datasets/davis-southern-women/data.d.ts +3 -0
- package/dist/src/datasets/davis-southern-women/data.d.ts.map +1 -0
- package/dist/src/datasets/davis-southern-women/data.js +57 -0
- package/dist/src/datasets/davis-southern-women/data.js.map +1 -0
- package/dist/src/datasets/davis-southern-women/index.d.ts +11 -0
- package/dist/src/datasets/davis-southern-women/index.d.ts.map +1 -0
- package/dist/src/datasets/davis-southern-women/index.js +14 -0
- package/dist/src/datasets/davis-southern-women/index.js.map +1 -0
- package/dist/src/datasets/davis-southern-women/meta.d.ts +4 -0
- package/dist/src/datasets/davis-southern-women/meta.d.ts.map +1 -0
- package/dist/src/datasets/davis-southern-women/meta.js +17 -0
- package/dist/src/datasets/davis-southern-women/meta.js.map +1 -0
- package/dist/src/datasets/dolphins/data.d.ts +3 -0
- package/dist/src/datasets/dolphins/data.d.ts.map +1 -0
- package/dist/src/datasets/dolphins/data.js +93 -0
- package/dist/src/datasets/dolphins/data.js.map +1 -0
- package/dist/src/datasets/dolphins/index.d.ts +11 -0
- package/dist/src/datasets/dolphins/index.d.ts.map +1 -0
- package/dist/src/datasets/dolphins/index.js +14 -0
- package/dist/src/datasets/dolphins/index.js.map +1 -0
- package/dist/src/datasets/dolphins/meta.d.ts +4 -0
- package/dist/src/datasets/dolphins/meta.d.ts.map +1 -0
- package/dist/src/datasets/dolphins/meta.js +17 -0
- package/dist/src/datasets/dolphins/meta.js.map +1 -0
- package/dist/src/datasets/florentine-families/data.d.ts +3 -0
- package/dist/src/datasets/florentine-families/data.d.ts.map +1 -0
- package/dist/src/datasets/florentine-families/data.js +31 -0
- package/dist/src/datasets/florentine-families/data.js.map +1 -0
- package/dist/src/datasets/florentine-families/index.d.ts +11 -0
- package/dist/src/datasets/florentine-families/index.d.ts.map +1 -0
- package/dist/src/datasets/florentine-families/index.js +14 -0
- package/dist/src/datasets/florentine-families/index.js.map +1 -0
- package/dist/src/datasets/florentine-families/meta.d.ts +4 -0
- package/dist/src/datasets/florentine-families/meta.d.ts.map +1 -0
- package/dist/src/datasets/florentine-families/meta.js +17 -0
- package/dist/src/datasets/florentine-families/meta.js.map +1 -0
- package/dist/src/datasets/football/data.d.ts +3 -0
- package/dist/src/datasets/football/data.d.ts.map +1 -0
- package/dist/src/datasets/football/data.js +210 -0
- package/dist/src/datasets/football/data.js.map +1 -0
- package/dist/src/datasets/football/index.d.ts +11 -0
- package/dist/src/datasets/football/index.d.ts.map +1 -0
- package/dist/src/datasets/football/index.js +14 -0
- package/dist/src/datasets/football/index.js.map +1 -0
- package/dist/src/datasets/football/meta.d.ts +4 -0
- package/dist/src/datasets/football/meta.d.ts.map +1 -0
- package/dist/src/datasets/football/meta.js +17 -0
- package/dist/src/datasets/football/meta.js.map +1 -0
- package/dist/src/datasets/hosted.d.ts +7 -0
- package/dist/src/datasets/hosted.d.ts.map +1 -0
- package/dist/src/datasets/hosted.js +80 -0
- package/dist/src/datasets/hosted.js.map +1 -0
- package/dist/src/datasets/karate/data.d.ts +3 -0
- package/dist/src/datasets/karate/data.d.ts.map +1 -0
- package/dist/src/datasets/karate/data.js +30 -0
- package/dist/src/datasets/karate/data.js.map +1 -0
- package/dist/src/datasets/karate/index.d.ts +11 -0
- package/dist/src/datasets/karate/index.d.ts.map +1 -0
- package/dist/src/datasets/karate/index.js +14 -0
- package/dist/src/datasets/karate/index.js.map +1 -0
- package/dist/src/datasets/karate/meta.d.ts +4 -0
- package/dist/src/datasets/karate/meta.d.ts.map +1 -0
- package/dist/src/datasets/karate/meta.js +22 -0
- package/dist/src/datasets/karate/meta.js.map +1 -0
- package/dist/src/datasets/knuth-miles/data.d.ts +3 -0
- package/dist/src/datasets/knuth-miles/data.d.ts.map +1 -0
- package/dist/src/datasets/knuth-miles/data.js +1203 -0
- package/dist/src/datasets/knuth-miles/data.js.map +1 -0
- package/dist/src/datasets/knuth-miles/index.d.ts +11 -0
- package/dist/src/datasets/knuth-miles/index.d.ts.map +1 -0
- package/dist/src/datasets/knuth-miles/index.js +14 -0
- package/dist/src/datasets/knuth-miles/index.js.map +1 -0
- package/dist/src/datasets/knuth-miles/meta.d.ts +4 -0
- package/dist/src/datasets/knuth-miles/meta.d.ts.map +1 -0
- package/dist/src/datasets/knuth-miles/meta.js +26 -0
- package/dist/src/datasets/knuth-miles/meta.js.map +1 -0
- package/dist/src/datasets/les-miserables/data.d.ts +3 -0
- package/dist/src/datasets/les-miserables/data.d.ts.map +1 -0
- package/dist/src/datasets/les-miserables/data.js +117 -0
- package/dist/src/datasets/les-miserables/data.js.map +1 -0
- package/dist/src/datasets/les-miserables/index.d.ts +11 -0
- package/dist/src/datasets/les-miserables/index.d.ts.map +1 -0
- package/dist/src/datasets/les-miserables/index.js +14 -0
- package/dist/src/datasets/les-miserables/index.js.map +1 -0
- package/dist/src/datasets/les-miserables/meta.d.ts +4 -0
- package/dist/src/datasets/les-miserables/meta.d.ts.map +1 -0
- package/dist/src/datasets/les-miserables/meta.js +21 -0
- package/dist/src/datasets/les-miserables/meta.js.map +1 -0
- package/dist/src/datasets/openflights/data.d.ts +3 -0
- package/dist/src/datasets/openflights/data.d.ts.map +1 -0
- package/dist/src/datasets/openflights/data.js +15457 -0
- package/dist/src/datasets/openflights/data.js.map +1 -0
- package/dist/src/datasets/openflights/index.d.ts +11 -0
- package/dist/src/datasets/openflights/index.d.ts.map +1 -0
- package/dist/src/datasets/openflights/index.js +14 -0
- package/dist/src/datasets/openflights/index.js.map +1 -0
- package/dist/src/datasets/openflights/meta.d.ts +4 -0
- package/dist/src/datasets/openflights/meta.d.ts.map +1 -0
- package/dist/src/datasets/openflights/meta.js +28 -0
- package/dist/src/datasets/openflights/meta.js.map +1 -0
- package/dist/src/datasets/political-blogs/data.d.ts +3 -0
- package/dist/src/datasets/political-blogs/data.d.ts.map +1 -0
- package/dist/src/datasets/political-blogs/data.js +4857 -0
- package/dist/src/datasets/political-blogs/data.js.map +1 -0
- package/dist/src/datasets/political-blogs/index.d.ts +11 -0
- package/dist/src/datasets/political-blogs/index.d.ts.map +1 -0
- package/dist/src/datasets/political-blogs/index.js +14 -0
- package/dist/src/datasets/political-blogs/index.js.map +1 -0
- package/dist/src/datasets/political-blogs/meta.d.ts +4 -0
- package/dist/src/datasets/political-blogs/meta.d.ts.map +1 -0
- package/dist/src/datasets/political-blogs/meta.js +26 -0
- package/dist/src/datasets/political-blogs/meta.js.map +1 -0
- package/dist/src/datasets/political-books/data.d.ts +3 -0
- package/dist/src/datasets/political-books/data.d.ts.map +1 -0
- package/dist/src/datasets/political-books/data.js +165 -0
- package/dist/src/datasets/political-books/data.js.map +1 -0
- package/dist/src/datasets/political-books/index.d.ts +11 -0
- package/dist/src/datasets/political-books/index.d.ts.map +1 -0
- package/dist/src/datasets/political-books/index.js +14 -0
- package/dist/src/datasets/political-books/index.js.map +1 -0
- package/dist/src/datasets/political-books/meta.d.ts +4 -0
- package/dist/src/datasets/political-books/meta.d.ts.map +1 -0
- package/dist/src/datasets/political-books/meta.js +20 -0
- package/dist/src/datasets/political-books/meta.js.map +1 -0
- package/dist/src/datasets/remote.d.ts +27 -0
- package/dist/src/datasets/remote.d.ts.map +1 -0
- package/dist/src/datasets/remote.js +30 -0
- package/dist/src/datasets/remote.js.map +1 -0
- package/dist/src/element.d.ts +20 -0
- package/dist/src/element.d.ts.map +1 -0
- package/dist/src/element.js +27 -0
- package/dist/src/element.js.map +1 -0
- package/dist/src/generators/bipartite.d.ts +51 -0
- package/dist/src/generators/bipartite.d.ts.map +1 -0
- package/dist/src/generators/bipartite.js +99 -0
- package/dist/src/generators/bipartite.js.map +1 -0
- package/dist/src/generators/block-model.d.ts +75 -0
- package/dist/src/generators/block-model.d.ts.map +1 -0
- package/dist/src/generators/block-model.js +116 -0
- package/dist/src/generators/block-model.js.map +1 -0
- package/dist/src/generators/classic.d.ts +208 -0
- package/dist/src/generators/classic.d.ts.map +1 -0
- package/dist/src/generators/classic.js +437 -0
- package/dist/src/generators/classic.js.map +1 -0
- package/dist/src/generators/degree-sequence.d.ts +273 -0
- package/dist/src/generators/degree-sequence.d.ts.map +1 -0
- package/dist/src/generators/degree-sequence.js +646 -0
- package/dist/src/generators/degree-sequence.js.map +1 -0
- package/dist/src/generators/directed.d.ts +141 -0
- package/dist/src/generators/directed.d.ts.map +1 -0
- package/dist/src/generators/directed.js +329 -0
- package/dist/src/generators/directed.js.map +1 -0
- package/dist/src/generators/erdos-renyi.d.ts +58 -0
- package/dist/src/generators/erdos-renyi.d.ts.map +1 -0
- package/dist/src/generators/erdos-renyi.js +154 -0
- package/dist/src/generators/erdos-renyi.js.map +1 -0
- package/dist/src/generators/flow.d.ts +153 -0
- package/dist/src/generators/flow.d.ts.map +1 -0
- package/dist/src/generators/flow.js +346 -0
- package/dist/src/generators/flow.js.map +1 -0
- package/dist/src/generators/geometric.d.ts +133 -0
- package/dist/src/generators/geometric.d.ts.map +1 -0
- package/dist/src/generators/geometric.js +495 -0
- package/dist/src/generators/geometric.js.map +1 -0
- package/dist/src/generators/growth.d.ts +187 -0
- package/dist/src/generators/growth.d.ts.map +1 -0
- package/dist/src/generators/growth.js +445 -0
- package/dist/src/generators/growth.js.map +1 -0
- package/dist/src/generators/hyperbolic.d.ts +84 -0
- package/dist/src/generators/hyperbolic.d.ts.map +1 -0
- package/dist/src/generators/hyperbolic.js +153 -0
- package/dist/src/generators/hyperbolic.js.map +1 -0
- package/dist/src/generators/index.d.ts +25 -0
- package/dist/src/generators/index.d.ts.map +1 -0
- package/dist/src/generators/index.js +24 -0
- package/dist/src/generators/index.js.map +1 -0
- package/dist/src/generators/lattices.d.ts +87 -0
- package/dist/src/generators/lattices.d.ts.map +1 -0
- package/dist/src/generators/lattices.js +237 -0
- package/dist/src/generators/lattices.js.map +1 -0
- package/dist/src/generators/lfr.d.ts +55 -0
- package/dist/src/generators/lfr.d.ts.map +1 -0
- package/dist/src/generators/lfr.js +178 -0
- package/dist/src/generators/lfr.js.map +1 -0
- package/dist/src/generators/named.d.ts +23 -0
- package/dist/src/generators/named.d.ts.map +1 -0
- package/dist/src/generators/named.js +191 -0
- package/dist/src/generators/named.js.map +1 -0
- package/dist/src/generators/preferential-attachment.d.ts +66 -0
- package/dist/src/generators/preferential-attachment.d.ts.map +1 -0
- package/dist/src/generators/preferential-attachment.js +157 -0
- package/dist/src/generators/preferential-attachment.js.map +1 -0
- package/dist/src/generators/trees-and-dags.d.ts +53 -0
- package/dist/src/generators/trees-and-dags.d.ts.map +1 -0
- package/dist/src/generators/trees-and-dags.js +108 -0
- package/dist/src/generators/trees-and-dags.js.map +1 -0
- package/dist/src/generators/util.d.ts +84 -0
- package/dist/src/generators/util.d.ts.map +1 -0
- package/dist/src/generators/util.js +138 -0
- package/dist/src/generators/util.js.map +1 -0
- package/dist/src/generators/variants.d.ts +85 -0
- package/dist/src/generators/variants.d.ts.map +1 -0
- package/dist/src/generators/variants.js +215 -0
- package/dist/src/generators/variants.js.map +1 -0
- package/dist/src/generators/weights.d.ts +65 -0
- package/dist/src/generators/weights.d.ts.map +1 -0
- package/dist/src/generators/weights.js +135 -0
- package/dist/src/generators/weights.js.map +1 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/random/exp.d.ts +23 -0
- package/dist/src/random/exp.d.ts.map +1 -0
- package/dist/src/random/exp.js +101 -0
- package/dist/src/random/exp.js.map +1 -0
- package/dist/src/random/log.d.ts +19 -0
- package/dist/src/random/log.d.ts.map +1 -0
- package/dist/src/random/log.js +83 -0
- package/dist/src/random/log.js.map +1 -0
- package/dist/src/random/stream.d.ts +93 -0
- package/dist/src/random/stream.d.ts.map +1 -0
- package/dist/src/random/stream.js +154 -0
- package/dist/src/random/stream.js.map +1 -0
- package/dist/src/random/threefry.d.ts +19 -0
- package/dist/src/random/threefry.d.ts.map +1 -0
- package/dist/src/random/threefry.js +43 -0
- package/dist/src/random/threefry.js.map +1 -0
- package/dist/src/random/trig.d.ts +16 -0
- package/dist/src/random/trig.d.ts.map +1 -0
- package/dist/src/random/trig.js +78 -0
- package/dist/src/random/trig.js.map +1 -0
- package/dist/src/types.d.ts +28 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +102 -5
- package/src/datasets/build.ts +140 -0
- package/src/datasets/catalog.ts +35 -0
- package/src/datasets/celegans-neural/data.ts +575 -0
- package/src/datasets/celegans-neural/index.ts +17 -0
- package/src/datasets/celegans-neural/meta.ts +25 -0
- package/src/datasets/contiguous-usa/data.ts +164 -0
- package/src/datasets/contiguous-usa/index.ts +17 -0
- package/src/datasets/contiguous-usa/meta.ts +31 -0
- package/src/datasets/davis-southern-women/data.ts +59 -0
- package/src/datasets/davis-southern-women/index.ts +17 -0
- package/src/datasets/davis-southern-women/meta.ts +20 -0
- package/src/datasets/dolphins/data.ts +95 -0
- package/src/datasets/dolphins/index.ts +17 -0
- package/src/datasets/dolphins/meta.ts +21 -0
- package/src/datasets/florentine-families/data.ts +33 -0
- package/src/datasets/florentine-families/index.ts +17 -0
- package/src/datasets/florentine-families/meta.ts +20 -0
- package/src/datasets/football/data.ts +212 -0
- package/src/datasets/football/index.ts +17 -0
- package/src/datasets/football/meta.ts +20 -0
- package/src/datasets/hosted.ts +90 -0
- package/src/datasets/karate/data.ts +32 -0
- package/src/datasets/karate/index.ts +17 -0
- package/src/datasets/karate/meta.ts +25 -0
- package/src/datasets/knuth-miles/data.ts +1205 -0
- package/src/datasets/knuth-miles/index.ts +17 -0
- package/src/datasets/knuth-miles/meta.ts +29 -0
- package/src/datasets/les-miserables/data.ts +119 -0
- package/src/datasets/les-miserables/index.ts +17 -0
- package/src/datasets/les-miserables/meta.ts +24 -0
- package/src/datasets/openflights/data.ts +15459 -0
- package/src/datasets/openflights/index.ts +17 -0
- package/src/datasets/openflights/meta.ts +31 -0
- package/src/datasets/political-blogs/data.ts +4859 -0
- package/src/datasets/political-blogs/index.ts +17 -0
- package/src/datasets/political-blogs/meta.ts +30 -0
- package/src/datasets/political-books/data.ts +167 -0
- package/src/datasets/political-books/index.ts +17 -0
- package/src/datasets/political-books/meta.ts +23 -0
- package/src/datasets/remote.ts +42 -0
- package/src/element.ts +41 -0
- package/src/generators/bipartite.ts +127 -0
- package/src/generators/block-model.ts +160 -0
- package/src/generators/classic.ts +461 -0
- package/src/generators/degree-sequence.ts +807 -0
- package/src/generators/directed.ts +418 -0
- package/src/generators/erdos-renyi.ts +188 -0
- package/src/generators/flow.ts +443 -0
- package/src/generators/geometric.ts +591 -0
- package/src/generators/growth.ts +532 -0
- package/src/generators/hyperbolic.ts +193 -0
- package/src/generators/index.ts +133 -0
- package/src/generators/lattices.ts +290 -0
- package/src/generators/lfr.ts +227 -0
- package/src/generators/named.ts +198 -0
- package/src/generators/preferential-attachment.ts +188 -0
- package/src/generators/trees-and-dags.ts +139 -0
- package/src/generators/util.ts +167 -0
- package/src/generators/variants.ts +253 -0
- package/src/generators/weights.ts +177 -0
- package/src/index.ts +12 -0
- package/src/random/exp.ts +104 -0
- package/src/random/log.ts +86 -0
- package/src/random/stream.ts +169 -0
- package/src/random/threefry.ts +45 -0
- package/src/random/trig.ts +83 -0
- package/src/types.ts +28 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maximum-flow networks: a grid (the image-segmentation shape), a random layered DAG, GENRMF and
|
|
3
|
+
* the AK network. Every one is directed, with integer capacities as its `weights`, a `role` node
|
|
4
|
+
* column and its source and sink.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { detLog } from "../random/log.js";
|
|
8
|
+
import { RandomStream, resolveSeed } from "../random/stream.js";
|
|
9
|
+
import { type SampleGraph } from "../types.js";
|
|
10
|
+
import { bernoulliSegment, checkEdgeCount, checkInt, checkProbability, EdgeBuffer } from "./util.js";
|
|
11
|
+
|
|
12
|
+
/** A maximum-flow instance: a directed graph whose `weights` are integer capacities. */
|
|
13
|
+
export interface FlowNetwork extends SampleGraph {
|
|
14
|
+
/** The source node. */
|
|
15
|
+
readonly source: number;
|
|
16
|
+
/** The sink node. */
|
|
17
|
+
readonly sink: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The largest capacity: 2^24, the last point where every integer is exact in a Float32 weight.
|
|
22
|
+
*/
|
|
23
|
+
const MAX_CAPACITY = 2 ** 24;
|
|
24
|
+
|
|
25
|
+
/** The capacity range options of the random flow networks. */
|
|
26
|
+
interface CapacityOptions {
|
|
27
|
+
/** The smallest arc capacity, an integer >= 0; default 1. */
|
|
28
|
+
minCapacity?: number | undefined;
|
|
29
|
+
/** The largest arc capacity, an integer >= minCapacity; default 10. */
|
|
30
|
+
maxCapacity?: number | undefined;
|
|
31
|
+
/** The seed, an integer in [0, 2^53); default 0. */
|
|
32
|
+
seed?: number | undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The checked capacity range.
|
|
37
|
+
* @param options - the options
|
|
38
|
+
* @param terminalFactor - the terminal arcs carry terminalFactor * maxCapacity, which must stay exact
|
|
39
|
+
* @returns min and max
|
|
40
|
+
*/
|
|
41
|
+
function capacityRange(options: CapacityOptions, terminalFactor: number): { min: number; max: number } {
|
|
42
|
+
const min = options.minCapacity ?? 1;
|
|
43
|
+
const max = options.maxCapacity ?? 10;
|
|
44
|
+
checkInt("minCapacity", min, 0, MAX_CAPACITY);
|
|
45
|
+
checkInt("maxCapacity", max, min, Math.floor(MAX_CAPACITY / terminalFactor));
|
|
46
|
+
return { min, max };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Assemble a flow network.
|
|
51
|
+
* @param n - the node count
|
|
52
|
+
* @param out - the arcs
|
|
53
|
+
* @param capacities - one capacity per arc
|
|
54
|
+
* @param source - the source
|
|
55
|
+
* @param sink - the sink
|
|
56
|
+
* @param columns - node columns besides `role`
|
|
57
|
+
* @returns the network
|
|
58
|
+
*/
|
|
59
|
+
function toNetwork(
|
|
60
|
+
n: number,
|
|
61
|
+
out: EdgeBuffer,
|
|
62
|
+
capacities: number[],
|
|
63
|
+
source: number,
|
|
64
|
+
sink: number,
|
|
65
|
+
columns: NonNullable<SampleGraph["nodeColumns"]>,
|
|
66
|
+
): FlowNetwork {
|
|
67
|
+
const { src, dst } = out.finish();
|
|
68
|
+
const role = new Uint8Array(n);
|
|
69
|
+
role[source] = 1;
|
|
70
|
+
role[sink] = 2;
|
|
71
|
+
return {
|
|
72
|
+
directed: true,
|
|
73
|
+
nodeCount: n,
|
|
74
|
+
src,
|
|
75
|
+
dst,
|
|
76
|
+
weights: Float32Array.from(capacities),
|
|
77
|
+
nodeColumns: { ...columns, role },
|
|
78
|
+
source,
|
|
79
|
+
sink,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Push the arcs of node (r, c) of a rows x cols grid starting at `base` to its 4-neighbours, in
|
|
85
|
+
* the order right, down, left, up.
|
|
86
|
+
* @param out - the buffer
|
|
87
|
+
* @param base - the grid's first node
|
|
88
|
+
* @param rows - the row count
|
|
89
|
+
* @param cols - the column count
|
|
90
|
+
* @param r - the row
|
|
91
|
+
* @param c - the column
|
|
92
|
+
* @returns how many arcs were pushed
|
|
93
|
+
*/
|
|
94
|
+
function gridArcs(out: EdgeBuffer, base: number, rows: number, cols: number, r: number, c: number): number {
|
|
95
|
+
const u = base + r * cols + c;
|
|
96
|
+
const before = out.length;
|
|
97
|
+
if (c + 1 < cols) {
|
|
98
|
+
out.push(u, u + 1);
|
|
99
|
+
}
|
|
100
|
+
if (r + 1 < rows) {
|
|
101
|
+
out.push(u, u + cols);
|
|
102
|
+
}
|
|
103
|
+
if (c > 0) {
|
|
104
|
+
out.push(u, u - 1);
|
|
105
|
+
}
|
|
106
|
+
if (r > 0) {
|
|
107
|
+
out.push(u, u - cols);
|
|
108
|
+
}
|
|
109
|
+
return out.length - before;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Options of {@link gridFlowNetwork}. */
|
|
113
|
+
export interface GridFlowOptions extends CapacityOptions {
|
|
114
|
+
/** The grid's row count, >= 1. */
|
|
115
|
+
rows: number;
|
|
116
|
+
/** The grid's column count, >= 2. */
|
|
117
|
+
cols: number;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* A grid flow network, the shape of graph-cut image segmentation: node r * cols + c for pixel
|
|
122
|
+
* (r, c), arcs to each 4-neighbour in both directions, listed by node, in the order right, down,
|
|
123
|
+
* left, up; node u draws its arcs' capacities, uniform integers in [minCapacity, maxCapacity],
|
|
124
|
+
* from stream (seed, "grid-flow", u) in that order. Then the source rows * cols with an arc to
|
|
125
|
+
* every left-column node (by row), and every right-column node with an arc to the sink
|
|
126
|
+
* rows * cols + 1 (by row), each of capacity 4 * maxCapacity. Those terminal arcs are never a
|
|
127
|
+
* minimum cut: the arcs from the first column to the second already cut the network with at most
|
|
128
|
+
* rows * maxCapacity. Node columns `x` = c and `y` = r (Float64), the source at x = -1 and the
|
|
129
|
+
* sink at x = cols, both at the middle row; `role` (u8: 0 inner, 1 source, 2 sink). O(rows cols).
|
|
130
|
+
* @param options - rows, cols, minCapacity, maxCapacity and seed
|
|
131
|
+
* @returns the flow network
|
|
132
|
+
*/
|
|
133
|
+
export function gridFlowNetwork(options: GridFlowOptions): FlowNetwork {
|
|
134
|
+
const { rows, cols } = options;
|
|
135
|
+
checkInt("rows", rows, 1);
|
|
136
|
+
checkInt("cols", cols, 2);
|
|
137
|
+
const cells = rows * cols;
|
|
138
|
+
checkInt("rows * cols + 2 (the node count)", cells + 2, 0);
|
|
139
|
+
const { min, max } = capacityRange(options, 4);
|
|
140
|
+
const seed = resolveSeed(options.seed);
|
|
141
|
+
const arcs = 2 * (rows * (cols - 1) + cols * (rows - 1)) + 2 * rows;
|
|
142
|
+
checkEdgeCount(arcs);
|
|
143
|
+
const out = new EdgeBuffer(arcs);
|
|
144
|
+
const capacities: number[] = [];
|
|
145
|
+
const stream = new RandomStream(seed, "grid-flow", 0);
|
|
146
|
+
const x = new Float64Array(cells + 2);
|
|
147
|
+
const y = new Float64Array(cells + 2);
|
|
148
|
+
for (let r = 0; r < rows; r++) {
|
|
149
|
+
for (let c = 0; c < cols; c++) {
|
|
150
|
+
const u = r * cols + c;
|
|
151
|
+
x[u] = c;
|
|
152
|
+
y[u] = r;
|
|
153
|
+
stream.reset(u);
|
|
154
|
+
const count = gridArcs(out, 0, rows, cols, r, c);
|
|
155
|
+
for (let i = 0; i < count; i++) {
|
|
156
|
+
capacities.push(min + stream.nextBelow(max - min + 1));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const source = cells;
|
|
161
|
+
const sink = cells + 1;
|
|
162
|
+
x[source] = -1;
|
|
163
|
+
x[sink] = cols;
|
|
164
|
+
y[source] = (rows - 1) / 2;
|
|
165
|
+
y[sink] = (rows - 1) / 2;
|
|
166
|
+
for (let r = 0; r < rows; r++) {
|
|
167
|
+
out.push(source, r * cols);
|
|
168
|
+
capacities.push(4 * max);
|
|
169
|
+
}
|
|
170
|
+
for (let r = 0; r < rows; r++) {
|
|
171
|
+
out.push(r * cols + cols - 1, sink);
|
|
172
|
+
capacities.push(4 * max);
|
|
173
|
+
}
|
|
174
|
+
return toNetwork(cells + 2, out, capacities, source, sink, { x, y });
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** Options of {@link layeredFlowNetwork}. */
|
|
178
|
+
export interface LayeredFlowOptions extends CapacityOptions {
|
|
179
|
+
/** The width of every inner layer, >= 1 each; layer i holds the next `layers[i]` node indices. */
|
|
180
|
+
layers: readonly number[];
|
|
181
|
+
/** The probability of each arc from a node to a node of the next layer. */
|
|
182
|
+
p: number;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** The node layout of a layered flow network. */
|
|
186
|
+
interface LayeredFlowPlan {
|
|
187
|
+
/** starts[i] = the first node of inner layer i; starts[L] = the inner node count. */
|
|
188
|
+
readonly starts: readonly number[];
|
|
189
|
+
/** The inner layer of every inner node. */
|
|
190
|
+
readonly layerOf: Uint32Array;
|
|
191
|
+
/** The arc probability. */
|
|
192
|
+
readonly p: number;
|
|
193
|
+
/** The capacity range. */
|
|
194
|
+
readonly min: number;
|
|
195
|
+
/** The capacity range. */
|
|
196
|
+
readonly max: number;
|
|
197
|
+
/** The capacity of every terminal arc: max * (the widest layer). */
|
|
198
|
+
readonly terminal: number;
|
|
199
|
+
/** The resolved seed. */
|
|
200
|
+
readonly seed: number;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Check a layered flow network's options and lay out its nodes.
|
|
205
|
+
* @param options - the options
|
|
206
|
+
* @returns the plan
|
|
207
|
+
*/
|
|
208
|
+
export function planLayeredFlow(options: LayeredFlowOptions): LayeredFlowPlan {
|
|
209
|
+
const { layers, p } = options;
|
|
210
|
+
checkInt("layers.length", layers.length, 1);
|
|
211
|
+
checkProbability("p", p);
|
|
212
|
+
const starts = [0];
|
|
213
|
+
let widest = 0;
|
|
214
|
+
for (let i = 0; i < layers.length; i++) {
|
|
215
|
+
checkInt(`layers[${i}]`, layers[i], 1);
|
|
216
|
+
starts.push(starts[i] + layers[i]);
|
|
217
|
+
widest = Math.max(widest, layers[i]);
|
|
218
|
+
}
|
|
219
|
+
const inner = starts[layers.length];
|
|
220
|
+
checkInt("the total size + 2 (the node count)", inner + 2, 0);
|
|
221
|
+
const { min, max } = capacityRange(options, widest);
|
|
222
|
+
const layerOf = new Uint32Array(inner);
|
|
223
|
+
for (let i = 0; i < layers.length; i++) {
|
|
224
|
+
layerOf.fill(i, starts[i], starts[i + 1]);
|
|
225
|
+
}
|
|
226
|
+
return { starts, layerOf, p, min, max, terminal: max * widest, seed: resolveSeed(options.seed) };
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Rows [start, end) of the inner arcs of a layered flow network: inner node u of a layer before
|
|
231
|
+
* the last draws from stream (seed, "layered-flow", u) first its arcs to the next layer
|
|
232
|
+
* (ascending, by geometric skipping), then their capacities in the same order.
|
|
233
|
+
* @param plan - the plan
|
|
234
|
+
* @param start - the first inner node
|
|
235
|
+
* @param end - one past the last inner node
|
|
236
|
+
* @param out - receives the arcs
|
|
237
|
+
* @param capacities - receives their capacities
|
|
238
|
+
*/
|
|
239
|
+
export function layeredFlowRows(
|
|
240
|
+
plan: LayeredFlowPlan,
|
|
241
|
+
start: number,
|
|
242
|
+
end: number,
|
|
243
|
+
out: EdgeBuffer,
|
|
244
|
+
capacities: number[],
|
|
245
|
+
): void {
|
|
246
|
+
const { starts, layerOf, p, min, max } = plan;
|
|
247
|
+
const logQ = detLog(1 - p);
|
|
248
|
+
const stream = new RandomStream(plan.seed, "layered-flow", 0);
|
|
249
|
+
const last = starts.length - 2;
|
|
250
|
+
for (let u = start; u < end; u++) {
|
|
251
|
+
const layer = layerOf[u];
|
|
252
|
+
if (layer < last) {
|
|
253
|
+
stream.reset(u);
|
|
254
|
+
const before = out.length;
|
|
255
|
+
bernoulliSegment(stream, p, logQ, u, starts[layer + 1], starts[layer + 2], out);
|
|
256
|
+
for (let i = before; i < out.length; i++) {
|
|
257
|
+
capacities.push(min + stream.nextBelow(max - min + 1));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* A random layered flow network: inner layers as in `randomDagGraph` (arcs only from layer i to
|
|
265
|
+
* layer i + 1, each with probability p, capacities uniform integers in [minCapacity,
|
|
266
|
+
* maxCapacity]), a source feeding every node of the first layer and every node of the last layer
|
|
267
|
+
* feeding a sink. Inner nodes come first, layer by layer; the source is node N and the sink
|
|
268
|
+
* N + 1 (N inner nodes). Arcs: the inner arcs by source node (see {@link layeredFlowRows}), then
|
|
269
|
+
* source -> first-layer nodes ascending, then last-layer nodes -> sink ascending; each terminal
|
|
270
|
+
* arc has capacity maxCapacity * (the widest layer), at least what any one node can pass on.
|
|
271
|
+
* Node column `layer` (u32): inner layer i is i + 1, the source is layer 0 and the sink layer
|
|
272
|
+
* L + 1, so the column is a topological layering of the whole network; `role` (u8). O(N + m).
|
|
273
|
+
* @param options - layers, p, minCapacity, maxCapacity and seed
|
|
274
|
+
* @returns the flow network
|
|
275
|
+
*/
|
|
276
|
+
export function layeredFlowNetwork(options: LayeredFlowOptions): FlowNetwork {
|
|
277
|
+
const plan = planLayeredFlow(options);
|
|
278
|
+
const { starts } = plan;
|
|
279
|
+
const L = starts.length - 1;
|
|
280
|
+
const inner = starts[L];
|
|
281
|
+
const out = new EdgeBuffer(inner);
|
|
282
|
+
const capacities: number[] = [];
|
|
283
|
+
layeredFlowRows(plan, 0, inner, out, capacities);
|
|
284
|
+
const source = inner;
|
|
285
|
+
const sink = inner + 1;
|
|
286
|
+
const { terminal } = plan;
|
|
287
|
+
for (let u = starts[0]; u < starts[1]; u++) {
|
|
288
|
+
out.push(source, u);
|
|
289
|
+
capacities.push(terminal);
|
|
290
|
+
}
|
|
291
|
+
for (let u = starts[L - 1]; u < starts[L]; u++) {
|
|
292
|
+
out.push(u, sink);
|
|
293
|
+
capacities.push(terminal);
|
|
294
|
+
}
|
|
295
|
+
const layer = new Uint32Array(inner + 2);
|
|
296
|
+
for (let u = 0; u < inner; u++) {
|
|
297
|
+
layer[u] = plan.layerOf[u] + 1;
|
|
298
|
+
}
|
|
299
|
+
layer[sink] = L + 1;
|
|
300
|
+
return toNetwork(inner + 2, out, capacities, source, sink, { layer });
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/** Options of {@link genrmfGraph}. */
|
|
304
|
+
export interface GenrmfOptions {
|
|
305
|
+
/** The side of every frame (an a x a grid), >= 1. */
|
|
306
|
+
a: number;
|
|
307
|
+
/** The number of frames, >= 1. */
|
|
308
|
+
b: number;
|
|
309
|
+
/** The smallest capacity between frames, an integer >= 0. */
|
|
310
|
+
c1: number;
|
|
311
|
+
/** The largest capacity between frames, an integer >= c1; arcs inside a frame carry c2 a^2. */
|
|
312
|
+
c2: number;
|
|
313
|
+
/** The seed, an integer in [0, 2^53); default 0. */
|
|
314
|
+
seed?: number | undefined;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* GENRMF, the max-flow family of D. Goldfarb and M. D. Grigoriadis ("A computational comparison
|
|
319
|
+
* of the Dinic and network simplex methods for maximum flow", Annals of Operations Research 13,
|
|
320
|
+
* 81-123, 1988, doi:10.1007/BF02288321) as generated by Tamas Badics's `genrmf` (1991, First
|
|
321
|
+
* DIMACS Implementation Challenge): b frames, each an a x a grid. Node f a^2 + r a + c is (r, c)
|
|
322
|
+
* of frame f. Arcs, frame by frame: the frame's grid arcs to each 4-neighbour in both directions
|
|
323
|
+
* (by node; right, down, left, up) with capacity c2 a^2; then, for f < b - 1, node j of frame f
|
|
324
|
+
* -> node perm_f(j) of frame f + 1 for j ascending, with capacity uniform in [c1, c2]. Stream
|
|
325
|
+
* (seed, "genrmf", f) first draws perm_f, a Fisher-Yates shuffle of 0 .. a^2 - 1 (for i = a^2 - 1
|
|
326
|
+
* down to 1, swap i with nextBelow(i + 1)), then the a^2 capacities in j order. The source is
|
|
327
|
+
* node 0 (the first node of the first frame), the sink the last node of the last frame. Node
|
|
328
|
+
* columns `frame` (u32) and `role` (u8). Badics's own random numbers are not reproduced; the
|
|
329
|
+
* structure is. O(a^2 b).
|
|
330
|
+
* @param options - a, b, c1, c2 and seed
|
|
331
|
+
* @returns the flow network
|
|
332
|
+
*/
|
|
333
|
+
export function genrmfGraph(options: GenrmfOptions): FlowNetwork {
|
|
334
|
+
const { a, b, c1, c2 } = options;
|
|
335
|
+
checkInt("a", a, 1);
|
|
336
|
+
checkInt("b", b, 1);
|
|
337
|
+
const side = a * a;
|
|
338
|
+
checkInt("a * a * b (the node count)", side * b, 2);
|
|
339
|
+
checkInt("c1", c1, 0, MAX_CAPACITY);
|
|
340
|
+
checkInt("c2", c2, c1, MAX_CAPACITY);
|
|
341
|
+
if (c2 * side > MAX_CAPACITY) {
|
|
342
|
+
throw new RangeError(`c2 * a * a must be at most 2^24 to stay exact, got ${c2 * side}`);
|
|
343
|
+
}
|
|
344
|
+
const seed = resolveSeed(options.seed);
|
|
345
|
+
const n = side * b;
|
|
346
|
+
const arcs = b * 4 * a * (a - 1) + (b - 1) * side;
|
|
347
|
+
checkEdgeCount(arcs);
|
|
348
|
+
const out = new EdgeBuffer(arcs);
|
|
349
|
+
const capacities: number[] = [];
|
|
350
|
+
const frame = new Uint32Array(n);
|
|
351
|
+
const perm = new Uint32Array(side);
|
|
352
|
+
const stream = new RandomStream(seed, "genrmf", 0);
|
|
353
|
+
for (let f = 0; f < b; f++) {
|
|
354
|
+
const base = f * side;
|
|
355
|
+
frame.fill(f, base, base + side);
|
|
356
|
+
for (let r = 0; r < a; r++) {
|
|
357
|
+
for (let c = 0; c < a; c++) {
|
|
358
|
+
const count = gridArcs(out, base, a, a, r, c);
|
|
359
|
+
for (let i = 0; i < count; i++) {
|
|
360
|
+
capacities.push(c2 * side);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (f === b - 1) {
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
stream.reset(f);
|
|
368
|
+
for (let i = 0; i < side; i++) {
|
|
369
|
+
perm[i] = i;
|
|
370
|
+
}
|
|
371
|
+
for (let i = side - 1; i > 0; i--) {
|
|
372
|
+
const j = stream.nextBelow(i + 1);
|
|
373
|
+
const t = perm[i];
|
|
374
|
+
perm[i] = perm[j];
|
|
375
|
+
perm[j] = t;
|
|
376
|
+
}
|
|
377
|
+
for (let j = 0; j < side; j++) {
|
|
378
|
+
out.push(base + j, base + side + perm[j]);
|
|
379
|
+
capacities.push(c1 + stream.nextBelow(c2 - c1 + 1));
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return toNetwork(n, out, capacities, 0, n - 1, { frame });
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/** Options of {@link akGraph}. */
|
|
386
|
+
export interface AkOptions {
|
|
387
|
+
/** The size parameter, in [1, 499998]: 4k + 6 nodes and 6k + 7 arcs. */
|
|
388
|
+
k: number;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/** The capacity of the AK network's terminal arcs, as in igraph's ak-4102.max instance. */
|
|
392
|
+
const AK_BIG = 1000000;
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* The AK network of B. V. Cherkassky and A. V. Goldberg ("On implementing the push-relabel method
|
|
396
|
+
* for the maximum flow problem", Algorithmica 19, 390-410, 1997, doi:10.1007/PL00009180), built to
|
|
397
|
+
* be hard for push-relabel. Deterministic; n = 4k + 6 nodes, m = 6k + 7 arcs.
|
|
398
|
+
*
|
|
399
|
+
* Nodes: s = 0, t = 1; part A a_i = 2 + i (i = 0 .. k); a hub chain h = k + 3 .. e = 2k + 3;
|
|
400
|
+
* part B b_i = 2k + 4 + i (i = 0 .. 2k + 1). Arcs, in this order: for i = 0 .. k - 1, a_i ->
|
|
401
|
+
* a_{i+1} (capacity k + 1 - i) then a_i -> h (1); a_k -> e (1), a_k -> h (1); the chain j -> j + 1
|
|
402
|
+
* for j = h .. e - 1 (k + 1); b_i -> b_{i+1} for i = 0 .. 2k (k); the folds b_i -> b_{2k+1-i}
|
|
403
|
+
* (1) for i = 0 .. k - 1; finally s -> a_0, s -> b_0, e -> t and b_{2k+1} -> t, each 1000000.
|
|
404
|
+
* The maximum flow is 2k + 3 and the largest inner capacity k + 1, so k is capped at 499998 to
|
|
405
|
+
* keep the terminal capacity 1000000 from ever binding (every value is then exact in Float32).
|
|
406
|
+
* Node column `role` (u8). O(k).
|
|
407
|
+
* @param options - k
|
|
408
|
+
* @returns the flow network
|
|
409
|
+
*/
|
|
410
|
+
export function akGraph(options: AkOptions): FlowNetwork {
|
|
411
|
+
const { k } = options;
|
|
412
|
+
checkInt("k", k, 1, 499998);
|
|
413
|
+
const n = 4 * k + 6;
|
|
414
|
+
const out = new EdgeBuffer(6 * k + 7);
|
|
415
|
+
const capacities: number[] = [];
|
|
416
|
+
const arc = (u: number, v: number, capacity: number): void => {
|
|
417
|
+
out.push(u, v);
|
|
418
|
+
capacities.push(capacity);
|
|
419
|
+
};
|
|
420
|
+
const hub = k + 3;
|
|
421
|
+
const chainEnd = 2 * k + 3;
|
|
422
|
+
const b0 = 2 * k + 4;
|
|
423
|
+
for (let i = 0; i < k; i++) {
|
|
424
|
+
arc(2 + i, 3 + i, k + 1 - i);
|
|
425
|
+
arc(2 + i, hub, 1);
|
|
426
|
+
}
|
|
427
|
+
arc(2 + k, chainEnd, 1);
|
|
428
|
+
arc(2 + k, hub, 1);
|
|
429
|
+
for (let j = hub; j < chainEnd; j++) {
|
|
430
|
+
arc(j, j + 1, k + 1);
|
|
431
|
+
}
|
|
432
|
+
for (let i = 0; i <= 2 * k; i++) {
|
|
433
|
+
arc(b0 + i, b0 + i + 1, k);
|
|
434
|
+
}
|
|
435
|
+
for (let i = 0; i < k; i++) {
|
|
436
|
+
arc(b0 + i, b0 + 2 * k + 1 - i, 1);
|
|
437
|
+
}
|
|
438
|
+
arc(0, 2, AK_BIG);
|
|
439
|
+
arc(0, b0, AK_BIG);
|
|
440
|
+
arc(chainEnd, 1, AK_BIG);
|
|
441
|
+
arc(b0 + 2 * k + 1, 1, AK_BIG);
|
|
442
|
+
return toNetwork(n, out, capacities, 0, 1, {});
|
|
443
|
+
}
|