@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,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An exponential and the power functions built on it, returning the same bits on every JavaScript
|
|
3
|
+
* engine: a port of fdlibm's `__ieee754_exp` (e_exp.c, Sun Microsystems 1993), for the same reason
|
|
4
|
+
* and with the same technique as `detLog` in log.ts -- the exponent is read and written through a
|
|
5
|
+
* little-endian DataView and everything else is IEEE-754 double addition, subtraction,
|
|
6
|
+
* multiplication and division, which ECMAScript requires to be correctly rounded. Error below 1 ulp.
|
|
7
|
+
*/
|
|
8
|
+
import { detLog } from "./log.js";
|
|
9
|
+
const O_THRESHOLD = 7.09782712893383973096e2;
|
|
10
|
+
const U_THRESHOLD = -7.45133219101941108420e2;
|
|
11
|
+
const LN2_HI = 6.93147180369123816490e-1;
|
|
12
|
+
const LN2_LO = 1.90821492927058770002e-10;
|
|
13
|
+
const INV_LN2 = 1.44269504088896338700;
|
|
14
|
+
const TWOM1000 = 9.33263618503218878990e-302;
|
|
15
|
+
const P1 = 1.66666666666666019037e-1;
|
|
16
|
+
const P2 = -2.77777777770155933842e-3;
|
|
17
|
+
const P3 = 6.61375632143793436117e-5;
|
|
18
|
+
const P4 = -1.65339022054652515390e-6;
|
|
19
|
+
const P5 = 4.13813679705723846039e-8;
|
|
20
|
+
const view = new DataView(new ArrayBuffer(8));
|
|
21
|
+
/**
|
|
22
|
+
* `y * 2^k` for a y in [0.5, 2) and k >= -1021, by adding k to the exponent field.
|
|
23
|
+
* @param y - the mantissa part
|
|
24
|
+
* @param k - the power of two
|
|
25
|
+
* @returns the scaled value
|
|
26
|
+
*/
|
|
27
|
+
function scale(y, k) {
|
|
28
|
+
view.setFloat64(0, y, true);
|
|
29
|
+
view.setInt32(4, view.getInt32(4, true) + (k << 20), true);
|
|
30
|
+
return view.getFloat64(0, true);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* e^x, bit-identical across engines.
|
|
34
|
+
* @param x - the argument
|
|
35
|
+
* @returns e^x; +Infinity above about 709.78, 0 below about -745.13, NaN for NaN
|
|
36
|
+
*/
|
|
37
|
+
export function detExp(x) {
|
|
38
|
+
view.setFloat64(0, x, true);
|
|
39
|
+
const high = view.getInt32(4, true);
|
|
40
|
+
const negative = high < 0 ? 1 : 0;
|
|
41
|
+
const hx = high & 0x7fffffff;
|
|
42
|
+
if (hx >= 0x40862e42) {
|
|
43
|
+
if (hx >= 0x7ff00000) {
|
|
44
|
+
// NaN stays NaN, +Infinity stays, -Infinity gives 0
|
|
45
|
+
return negative === 0 || Number.isNaN(x) ? x + x : 0;
|
|
46
|
+
}
|
|
47
|
+
if (x > O_THRESHOLD) {
|
|
48
|
+
return Infinity;
|
|
49
|
+
}
|
|
50
|
+
if (x < U_THRESHOLD) {
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
let hi = 0;
|
|
55
|
+
let lo = 0;
|
|
56
|
+
let k = 0;
|
|
57
|
+
let r = x;
|
|
58
|
+
if (hx > 0x3fd62e42) {
|
|
59
|
+
// |x| > 0.5 ln 2: reduce to r = x - k ln 2
|
|
60
|
+
if (hx < 0x3ff0a2b2) {
|
|
61
|
+
hi = negative === 0 ? x - LN2_HI : x + LN2_HI;
|
|
62
|
+
lo = negative === 0 ? LN2_LO : -LN2_LO;
|
|
63
|
+
k = 1 - negative - negative;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
k = Math.trunc(INV_LN2 * x + (negative === 0 ? 0.5 : -0.5));
|
|
67
|
+
hi = x - k * LN2_HI;
|
|
68
|
+
lo = k * LN2_LO;
|
|
69
|
+
}
|
|
70
|
+
r = hi - lo;
|
|
71
|
+
}
|
|
72
|
+
else if (hx < 0x3e300000) {
|
|
73
|
+
// |x| < 2^-28
|
|
74
|
+
return 1 + x;
|
|
75
|
+
}
|
|
76
|
+
const t = r * r;
|
|
77
|
+
const c = r - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));
|
|
78
|
+
if (k === 0) {
|
|
79
|
+
return 1 - ((r * c) / (c - 2.0) - r);
|
|
80
|
+
}
|
|
81
|
+
const y = 1 - (lo - (r * c) / (2.0 - c) - hi);
|
|
82
|
+
return k >= -1021 ? scale(y, k) : scale(y, k + 1000) * TWOM1000;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* x^y as `detExp(y * detLog(x))` for x > 0: deterministic, not correctly rounded (the relative
|
|
86
|
+
* error grows with |y ln x|, about 1e-13 for the magnitudes the generators use). 0^y is 0 for
|
|
87
|
+
* y > 0.
|
|
88
|
+
* @param x - the base, >= 0
|
|
89
|
+
* @param y - the exponent
|
|
90
|
+
* @returns x^y
|
|
91
|
+
*/
|
|
92
|
+
export function detPow(x, y) {
|
|
93
|
+
if (x === 0) {
|
|
94
|
+
if (y === 0) {
|
|
95
|
+
return 1;
|
|
96
|
+
}
|
|
97
|
+
return y > 0 ? 0 : Infinity;
|
|
98
|
+
}
|
|
99
|
+
return detExp(y * detLog(x));
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=exp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exp.js","sourceRoot":"","sources":["../../../src/random/exp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A natural logarithm that returns the same bits on every JavaScript engine.
|
|
3
|
+
*
|
|
4
|
+
* ECMAScript leaves `Math.log` "implementation-approximated", so two engines may differ in the
|
|
5
|
+
* last bit, and a geometric skip `floor(log(u) / log(1 - p))` that lands on an integer boundary
|
|
6
|
+
* would then pick a different edge. This is a port of fdlibm's `__ieee754_log` (e_log.c, Sun
|
|
7
|
+
* Microsystems 1993, the code V8 and SpiderMonkey themselves use): it reads the exponent and
|
|
8
|
+
* mantissa through a little-endian DataView and otherwise uses only IEEE-754 double addition,
|
|
9
|
+
* subtraction, multiplication and division, which ECMAScript requires to be correctly rounded
|
|
10
|
+
* (and forbids from being fused). So the result is a pure function of the input bits.
|
|
11
|
+
* Error below 1 ulp.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* The natural logarithm of `x`, bit-identical across engines.
|
|
15
|
+
* @param input - the argument
|
|
16
|
+
* @returns ln(input); -Infinity for 0, NaN for negative input or NaN
|
|
17
|
+
*/
|
|
18
|
+
export declare function detLog(input: number): number;
|
|
19
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../src/random/log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsD5C"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A natural logarithm that returns the same bits on every JavaScript engine.
|
|
3
|
+
*
|
|
4
|
+
* ECMAScript leaves `Math.log` "implementation-approximated", so two engines may differ in the
|
|
5
|
+
* last bit, and a geometric skip `floor(log(u) / log(1 - p))` that lands on an integer boundary
|
|
6
|
+
* would then pick a different edge. This is a port of fdlibm's `__ieee754_log` (e_log.c, Sun
|
|
7
|
+
* Microsystems 1993, the code V8 and SpiderMonkey themselves use): it reads the exponent and
|
|
8
|
+
* mantissa through a little-endian DataView and otherwise uses only IEEE-754 double addition,
|
|
9
|
+
* subtraction, multiplication and division, which ECMAScript requires to be correctly rounded
|
|
10
|
+
* (and forbids from being fused). So the result is a pure function of the input bits.
|
|
11
|
+
* Error below 1 ulp.
|
|
12
|
+
*/
|
|
13
|
+
const LN2_HI = 6.9314718036912381649e-1; // 3fe62e42 fee00000
|
|
14
|
+
const LN2_LO = 1.90821492927058770002e-10; // 3dea39ef 35793c76
|
|
15
|
+
const TWO54 = 1.8014398509481984e16; // 43500000 00000000
|
|
16
|
+
const LG1 = 6.66666666666673513e-1; // 3FE55555 55555593
|
|
17
|
+
const LG2 = 3.999999999940941908e-1; // 3FD99999 9997FA04
|
|
18
|
+
const LG3 = 2.857142874366239149e-1; // 3FD24924 94229359
|
|
19
|
+
const LG4 = 2.222219843214978396e-1; // 3FCC71C5 1D8E78AF
|
|
20
|
+
const LG5 = 1.818357216161805012e-1; // 3FC74664 96CB03DE
|
|
21
|
+
const LG6 = 1.531383769920937332e-1; // 3FC39A09 D078C69F
|
|
22
|
+
const LG7 = 1.479819860511658591e-1; // 3FC2F112 DF3E5244
|
|
23
|
+
const view = new DataView(new ArrayBuffer(8));
|
|
24
|
+
/**
|
|
25
|
+
* The natural logarithm of `x`, bit-identical across engines.
|
|
26
|
+
* @param input - the argument
|
|
27
|
+
* @returns ln(input); -Infinity for 0, NaN for negative input or NaN
|
|
28
|
+
*/
|
|
29
|
+
export function detLog(input) {
|
|
30
|
+
let x = input;
|
|
31
|
+
view.setFloat64(0, x, true);
|
|
32
|
+
let hx = view.getInt32(4, true);
|
|
33
|
+
const lx = view.getUint32(0, true);
|
|
34
|
+
let k = 0;
|
|
35
|
+
if (hx < 0x00100000) {
|
|
36
|
+
if (((hx & 0x7fffffff) | lx) === 0) {
|
|
37
|
+
return -Infinity;
|
|
38
|
+
}
|
|
39
|
+
if (hx < 0) {
|
|
40
|
+
return NaN;
|
|
41
|
+
}
|
|
42
|
+
// subnormal: scale up
|
|
43
|
+
k -= 54;
|
|
44
|
+
x *= TWO54;
|
|
45
|
+
view.setFloat64(0, x, true);
|
|
46
|
+
hx = view.getInt32(4, true);
|
|
47
|
+
}
|
|
48
|
+
if (hx >= 0x7ff00000) {
|
|
49
|
+
return x + x;
|
|
50
|
+
}
|
|
51
|
+
k += (hx >> 20) - 1023;
|
|
52
|
+
hx &= 0x000fffff;
|
|
53
|
+
const i0 = (hx + 0x95f64) & 0x100000;
|
|
54
|
+
// normalize x or x/2
|
|
55
|
+
view.setInt32(4, hx | (i0 ^ 0x3ff00000), true);
|
|
56
|
+
x = view.getFloat64(0, true);
|
|
57
|
+
k += i0 >> 20;
|
|
58
|
+
const f = x - 1.0;
|
|
59
|
+
if ((0x000fffff & (2 + hx)) < 3) {
|
|
60
|
+
// |f| < 2**-20
|
|
61
|
+
if (f === 0) {
|
|
62
|
+
return k === 0 ? 0 : k * LN2_HI + k * LN2_LO;
|
|
63
|
+
}
|
|
64
|
+
const r = f * f * (0.5 - 0.3333333333333333 * f);
|
|
65
|
+
return k === 0 ? f - r : k * LN2_HI - (r - k * LN2_LO - f);
|
|
66
|
+
}
|
|
67
|
+
const s = f / (2.0 + f);
|
|
68
|
+
const dk = k;
|
|
69
|
+
const z = s * s;
|
|
70
|
+
let i = hx - 0x6147a;
|
|
71
|
+
const w = z * z;
|
|
72
|
+
const j = 0x6b851 - hx;
|
|
73
|
+
const t1 = w * (LG2 + w * (LG4 + w * LG6));
|
|
74
|
+
const t2 = z * (LG1 + w * (LG3 + w * (LG5 + w * LG7)));
|
|
75
|
+
i |= j;
|
|
76
|
+
const R = t2 + t1;
|
|
77
|
+
if (i > 0) {
|
|
78
|
+
const hfsq = 0.5 * f * f;
|
|
79
|
+
return k === 0 ? f - (hfsq - s * (hfsq + R)) : dk * LN2_HI - (hfsq - (s * (hfsq + R) + dk * LN2_LO) - f);
|
|
80
|
+
}
|
|
81
|
+
return k === 0 ? f - s * (f - R) : dk * LN2_HI - (s * (f - R) - dk * LN2_LO - f);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/random/log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one random number source of @graphty/graph-samples, and its determinism contract.
|
|
3
|
+
*
|
|
4
|
+
* A stream is named by `(seed, domain, block)`:
|
|
5
|
+
*
|
|
6
|
+
* - `seed` is the caller's seed, any safe integer in [0, 2^53).
|
|
7
|
+
* - `domain` is a fixed ASCII name per generator and purpose ("gnp", "sbm", ...). It is hashed
|
|
8
|
+
* with 32-bit FNV-1a to `domainId`.
|
|
9
|
+
* - `block` is a unit of work the ALGORITHM defines (a row of the adjacency matrix, a node), an
|
|
10
|
+
* integer in [0, 2^32). It never depends on how many workers or chunks run the generator.
|
|
11
|
+
*
|
|
12
|
+
* The stream's key is `Threefry2x32-20(key = (seed mod 2^32, floor(seed / 2^32)),
|
|
13
|
+
* counter = (domainId, block))`, and its words are `Threefry2x32-20(key = streamKey,
|
|
14
|
+
* counter = (i mod 2^32, floor(i / 2^32)))` for i = 0, 1, 2, ..., two words per counter, word 0
|
|
15
|
+
* first. Every draw below is defined in terms of those words with integer-exact arithmetic, so the
|
|
16
|
+
* same `(seed, domain, block)` yields the same values on every engine, platform and version.
|
|
17
|
+
* `test/random/stream.test.ts` freezes it with golden values: changing anything here changes every
|
|
18
|
+
* seeded graph, which is a breaking change of the package.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* 32-bit FNV-1a over the UTF-16 code units of `name` (the names are ASCII, so this is the bytes).
|
|
22
|
+
* @param name - the domain name
|
|
23
|
+
* @returns the unsigned 32-bit hash
|
|
24
|
+
*/
|
|
25
|
+
export declare function domainId(name: string): number;
|
|
26
|
+
/**
|
|
27
|
+
* The seed every random generator uses when the caller gives none: 0. A fixed default, never the
|
|
28
|
+
* clock, so an unseeded call is as reproducible as a seeded one. Frozen with the rest of the
|
|
29
|
+
* contract: changing it changes every unseeded graph.
|
|
30
|
+
*/
|
|
31
|
+
export declare const DEFAULT_SEED = 0;
|
|
32
|
+
/**
|
|
33
|
+
* The caller's seed, or {@link DEFAULT_SEED} when it is undefined; throws on an invalid seed.
|
|
34
|
+
* @param seed - the seed option
|
|
35
|
+
* @returns the seed to use
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveSeed(seed: number | undefined): number;
|
|
38
|
+
/**
|
|
39
|
+
* Throw unless `seed` is a safe non-negative integer.
|
|
40
|
+
* @param seed - the seed
|
|
41
|
+
*/
|
|
42
|
+
export declare function checkSeed(seed: number): void;
|
|
43
|
+
/** A deterministic stream of random words keyed by (seed, domain, block). */
|
|
44
|
+
export declare class RandomStream {
|
|
45
|
+
private readonly seedLo;
|
|
46
|
+
private readonly seedHi;
|
|
47
|
+
private readonly domain;
|
|
48
|
+
private readonly key;
|
|
49
|
+
private readonly out;
|
|
50
|
+
private counter;
|
|
51
|
+
private spare;
|
|
52
|
+
/**
|
|
53
|
+
* The stream of one block.
|
|
54
|
+
* @param seed - the caller's seed, an integer in [0, 2^53)
|
|
55
|
+
* @param domain - the generator's fixed domain name
|
|
56
|
+
* @param block - the first block, an integer in [0, 2^32)
|
|
57
|
+
*/
|
|
58
|
+
constructor(seed: number, domain: string, block: number);
|
|
59
|
+
/**
|
|
60
|
+
* Restart the stream at the first word of another block of the same seed and domain.
|
|
61
|
+
* @param block - the block, an integer in [0, 2^32)
|
|
62
|
+
*/
|
|
63
|
+
reset(block: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* The next word.
|
|
66
|
+
* @returns an unsigned 32-bit integer
|
|
67
|
+
*/
|
|
68
|
+
nextU32(): number;
|
|
69
|
+
/**
|
|
70
|
+
* A uniform double in [0, 1) with 53 random bits: (a >>> 5) * 2^26 + (b >>> 6), over 2^53,
|
|
71
|
+
* for the next two words a and b. Exact: every step is an integer below 2^53.
|
|
72
|
+
* @returns the double
|
|
73
|
+
*/
|
|
74
|
+
nextFloat(): number;
|
|
75
|
+
/**
|
|
76
|
+
* A uniform integer in [0, n) by masked rejection: draw a word, keep its low
|
|
77
|
+
* ceil(log2 n) bits, retry while the result is >= n. Exact and unbiased; fewer than two
|
|
78
|
+
* words per call on average. For n above 2^32 the high bits come from one extra word drawn
|
|
79
|
+
* first.
|
|
80
|
+
* @param n - the bound, an integer in [1, 2^53]
|
|
81
|
+
* @returns the integer
|
|
82
|
+
*/
|
|
83
|
+
nextBelow(n: number): number;
|
|
84
|
+
/**
|
|
85
|
+
* The number of failures before the next success of a Bernoulli(p) sequence, given
|
|
86
|
+
* `logQ = detLog(1 - p)` for 0 < p < 1: floor(detLog(1 - u) / logQ) for u = nextFloat().
|
|
87
|
+
* The caller handles p = 0 and p = 1 without drawing.
|
|
88
|
+
* @param logQ - detLog(1 - p), negative and finite
|
|
89
|
+
* @returns a non-negative integer (possibly above 2^53 for tiny p)
|
|
90
|
+
*/
|
|
91
|
+
nextSkip(logQ: number): number;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/random/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO7C;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI5D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED,6EAA6E;AAC7E,qBAAa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAAM;IAEnB;;;;;OAKG;gBACS,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAQvD;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM1B;;;OAGG;IACH,OAAO,IAAI,MAAM;IAYjB;;;;OAIG;IACH,SAAS,IAAI,MAAM;IAMnB;;;;;;;OAOG;IACH,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAqB5B;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAGjC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one random number source of @graphty/graph-samples, and its determinism contract.
|
|
3
|
+
*
|
|
4
|
+
* A stream is named by `(seed, domain, block)`:
|
|
5
|
+
*
|
|
6
|
+
* - `seed` is the caller's seed, any safe integer in [0, 2^53).
|
|
7
|
+
* - `domain` is a fixed ASCII name per generator and purpose ("gnp", "sbm", ...). It is hashed
|
|
8
|
+
* with 32-bit FNV-1a to `domainId`.
|
|
9
|
+
* - `block` is a unit of work the ALGORITHM defines (a row of the adjacency matrix, a node), an
|
|
10
|
+
* integer in [0, 2^32). It never depends on how many workers or chunks run the generator.
|
|
11
|
+
*
|
|
12
|
+
* The stream's key is `Threefry2x32-20(key = (seed mod 2^32, floor(seed / 2^32)),
|
|
13
|
+
* counter = (domainId, block))`, and its words are `Threefry2x32-20(key = streamKey,
|
|
14
|
+
* counter = (i mod 2^32, floor(i / 2^32)))` for i = 0, 1, 2, ..., two words per counter, word 0
|
|
15
|
+
* first. Every draw below is defined in terms of those words with integer-exact arithmetic, so the
|
|
16
|
+
* same `(seed, domain, block)` yields the same values on every engine, platform and version.
|
|
17
|
+
* `test/random/stream.test.ts` freezes it with golden values: changing anything here changes every
|
|
18
|
+
* seeded graph, which is a breaking change of the package.
|
|
19
|
+
*/
|
|
20
|
+
import { detLog } from "./log.js";
|
|
21
|
+
import { threefry2x32 } from "./threefry.js";
|
|
22
|
+
const TWO_32 = 4294967296;
|
|
23
|
+
const TWO_53 = 9007199254740992;
|
|
24
|
+
/**
|
|
25
|
+
* 32-bit FNV-1a over the UTF-16 code units of `name` (the names are ASCII, so this is the bytes).
|
|
26
|
+
* @param name - the domain name
|
|
27
|
+
* @returns the unsigned 32-bit hash
|
|
28
|
+
*/
|
|
29
|
+
export function domainId(name) {
|
|
30
|
+
let h = 0x811c9dc5;
|
|
31
|
+
for (let i = 0; i < name.length; i++) {
|
|
32
|
+
h ^= name.charCodeAt(i);
|
|
33
|
+
h = Math.imul(h, 0x01000193);
|
|
34
|
+
}
|
|
35
|
+
return h >>> 0;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The seed every random generator uses when the caller gives none: 0. A fixed default, never the
|
|
39
|
+
* clock, so an unseeded call is as reproducible as a seeded one. Frozen with the rest of the
|
|
40
|
+
* contract: changing it changes every unseeded graph.
|
|
41
|
+
*/
|
|
42
|
+
export const DEFAULT_SEED = 0;
|
|
43
|
+
/**
|
|
44
|
+
* The caller's seed, or {@link DEFAULT_SEED} when it is undefined; throws on an invalid seed.
|
|
45
|
+
* @param seed - the seed option
|
|
46
|
+
* @returns the seed to use
|
|
47
|
+
*/
|
|
48
|
+
export function resolveSeed(seed) {
|
|
49
|
+
const resolved = seed ?? DEFAULT_SEED;
|
|
50
|
+
checkSeed(resolved);
|
|
51
|
+
return resolved;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Throw unless `seed` is a safe non-negative integer.
|
|
55
|
+
* @param seed - the seed
|
|
56
|
+
*/
|
|
57
|
+
export function checkSeed(seed) {
|
|
58
|
+
if (!Number.isSafeInteger(seed) || seed < 0) {
|
|
59
|
+
throw new RangeError(`seed must be an integer in [0, 2^53), got ${String(seed)}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** A deterministic stream of random words keyed by (seed, domain, block). */
|
|
63
|
+
export class RandomStream {
|
|
64
|
+
/**
|
|
65
|
+
* The stream of one block.
|
|
66
|
+
* @param seed - the caller's seed, an integer in [0, 2^53)
|
|
67
|
+
* @param domain - the generator's fixed domain name
|
|
68
|
+
* @param block - the first block, an integer in [0, 2^32)
|
|
69
|
+
*/
|
|
70
|
+
constructor(seed, domain, block) {
|
|
71
|
+
this.key = new Uint32Array(2);
|
|
72
|
+
this.out = new Uint32Array(2);
|
|
73
|
+
this.counter = 0;
|
|
74
|
+
this.spare = -1;
|
|
75
|
+
checkSeed(seed);
|
|
76
|
+
this.seedLo = seed >>> 0;
|
|
77
|
+
this.seedHi = Math.floor(seed / TWO_32);
|
|
78
|
+
this.domain = domainId(domain);
|
|
79
|
+
this.reset(block);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Restart the stream at the first word of another block of the same seed and domain.
|
|
83
|
+
* @param block - the block, an integer in [0, 2^32)
|
|
84
|
+
*/
|
|
85
|
+
reset(block) {
|
|
86
|
+
threefry2x32(this.seedLo, this.seedHi, this.domain, block >>> 0, this.key);
|
|
87
|
+
this.counter = 0;
|
|
88
|
+
this.spare = -1;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The next word.
|
|
92
|
+
* @returns an unsigned 32-bit integer
|
|
93
|
+
*/
|
|
94
|
+
nextU32() {
|
|
95
|
+
if (this.spare >= 0) {
|
|
96
|
+
const word = this.spare;
|
|
97
|
+
this.spare = -1;
|
|
98
|
+
return word;
|
|
99
|
+
}
|
|
100
|
+
const c = this.counter++;
|
|
101
|
+
threefry2x32(this.key[0], this.key[1], c >>> 0, Math.floor(c / TWO_32), this.out);
|
|
102
|
+
this.spare = this.out[1];
|
|
103
|
+
return this.out[0];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* A uniform double in [0, 1) with 53 random bits: (a >>> 5) * 2^26 + (b >>> 6), over 2^53,
|
|
107
|
+
* for the next two words a and b. Exact: every step is an integer below 2^53.
|
|
108
|
+
* @returns the double
|
|
109
|
+
*/
|
|
110
|
+
nextFloat() {
|
|
111
|
+
const a = this.nextU32() >>> 5;
|
|
112
|
+
const b = this.nextU32() >>> 6;
|
|
113
|
+
return (a * 67108864 + b) / TWO_53;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A uniform integer in [0, n) by masked rejection: draw a word, keep its low
|
|
117
|
+
* ceil(log2 n) bits, retry while the result is >= n. Exact and unbiased; fewer than two
|
|
118
|
+
* words per call on average. For n above 2^32 the high bits come from one extra word drawn
|
|
119
|
+
* first.
|
|
120
|
+
* @param n - the bound, an integer in [1, 2^53]
|
|
121
|
+
* @returns the integer
|
|
122
|
+
*/
|
|
123
|
+
nextBelow(n) {
|
|
124
|
+
if (n <= TWO_32) {
|
|
125
|
+
const mask = n === 1 ? 0 : 0xffffffff >>> Math.clz32(n - 1);
|
|
126
|
+
for (;;) {
|
|
127
|
+
const x = (this.nextU32() & mask) >>> 0;
|
|
128
|
+
if (x < n) {
|
|
129
|
+
return x;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const hiBound = Math.ceil(n / TWO_32);
|
|
134
|
+
const hiMask = 0xffffffff >>> Math.clz32(hiBound - 1);
|
|
135
|
+
for (;;) {
|
|
136
|
+
const hi = (this.nextU32() & hiMask) >>> 0;
|
|
137
|
+
const x = hi * TWO_32 + this.nextU32();
|
|
138
|
+
if (x < n) {
|
|
139
|
+
return x;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The number of failures before the next success of a Bernoulli(p) sequence, given
|
|
145
|
+
* `logQ = detLog(1 - p)` for 0 < p < 1: floor(detLog(1 - u) / logQ) for u = nextFloat().
|
|
146
|
+
* The caller handles p = 0 and p = 1 without drawing.
|
|
147
|
+
* @param logQ - detLog(1 - p), negative and finite
|
|
148
|
+
* @returns a non-negative integer (possibly above 2^53 for tiny p)
|
|
149
|
+
*/
|
|
150
|
+
nextSkip(logQ) {
|
|
151
|
+
return Math.floor(detLog(1 - this.nextFloat()) / logQ);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/random/stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threefry-2x32 with 20 rounds: the counter-based block function of J. K. Salmon, M. A. Moraes,
|
|
3
|
+
* R. O. Dror and D. E. Shaw, "Parallel random numbers: as easy as 1, 2, 3", SC11 (2011),
|
|
4
|
+
* doi:10.1145/2063384.2063405, as specified by the Random123 library and used by JAX.
|
|
5
|
+
*
|
|
6
|
+
* It maps a 64-bit key and a 64-bit counter to 64 random bits using only 32-bit addition,
|
|
7
|
+
* rotation and xor, so JavaScript computes it exactly on every engine: no floating point, no
|
|
8
|
+
* 64-bit multiply, no BigInt. It passes BigCrush with 13 rounds; 20 is Random123's default.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Encrypt one 64-bit counter under one 64-bit key.
|
|
12
|
+
* @param k0 - key word 0 (unsigned 32-bit)
|
|
13
|
+
* @param k1 - key word 1 (unsigned 32-bit)
|
|
14
|
+
* @param c0 - counter word 0 (unsigned 32-bit)
|
|
15
|
+
* @param c1 - counter word 1 (unsigned 32-bit)
|
|
16
|
+
* @param out - receives the two output words
|
|
17
|
+
*/
|
|
18
|
+
export declare function threefry2x32(k0: number, k1: number, c0: number, c1: number, out: Uint32Array): void;
|
|
19
|
+
//# sourceMappingURL=threefry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threefry.d.ts","sourceRoot":"","sources":["../../../src/random/threefry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAoBnG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threefry-2x32 with 20 rounds: the counter-based block function of J. K. Salmon, M. A. Moraes,
|
|
3
|
+
* R. O. Dror and D. E. Shaw, "Parallel random numbers: as easy as 1, 2, 3", SC11 (2011),
|
|
4
|
+
* doi:10.1145/2063384.2063405, as specified by the Random123 library and used by JAX.
|
|
5
|
+
*
|
|
6
|
+
* It maps a 64-bit key and a 64-bit counter to 64 random bits using only 32-bit addition,
|
|
7
|
+
* rotation and xor, so JavaScript computes it exactly on every engine: no floating point, no
|
|
8
|
+
* 64-bit multiply, no BigInt. It passes BigCrush with 13 rounds; 20 is Random123's default.
|
|
9
|
+
*/
|
|
10
|
+
/** Rotation constants R_32x2 of Threefry-2x32 (Random123 threefry.h). */
|
|
11
|
+
const ROTATIONS = [13, 15, 26, 6, 17, 29, 16, 24];
|
|
12
|
+
/** The Skein key-schedule parity constant for 32-bit words. */
|
|
13
|
+
const KS_PARITY = 0x1bd11bda;
|
|
14
|
+
/**
|
|
15
|
+
* Encrypt one 64-bit counter under one 64-bit key.
|
|
16
|
+
* @param k0 - key word 0 (unsigned 32-bit)
|
|
17
|
+
* @param k1 - key word 1 (unsigned 32-bit)
|
|
18
|
+
* @param c0 - counter word 0 (unsigned 32-bit)
|
|
19
|
+
* @param c1 - counter word 1 (unsigned 32-bit)
|
|
20
|
+
* @param out - receives the two output words
|
|
21
|
+
*/
|
|
22
|
+
export function threefry2x32(k0, k1, c0, c1, out) {
|
|
23
|
+
const ks0 = k0 >>> 0;
|
|
24
|
+
const ks1 = k1 >>> 0;
|
|
25
|
+
const ks2 = (KS_PARITY ^ ks0 ^ ks1) >>> 0;
|
|
26
|
+
const ks = [ks0, ks1, ks2];
|
|
27
|
+
let x0 = (c0 + ks0) | 0;
|
|
28
|
+
let x1 = (c1 + ks1) | 0;
|
|
29
|
+
for (let round = 0; round < 20; round++) {
|
|
30
|
+
x0 = (x0 + x1) | 0;
|
|
31
|
+
const r = ROTATIONS[round & 7];
|
|
32
|
+
x1 = (x1 << r) | (x1 >>> (32 - r));
|
|
33
|
+
x1 ^= x0;
|
|
34
|
+
if ((round & 3) === 3) {
|
|
35
|
+
const s = (round + 1) >>> 2;
|
|
36
|
+
x0 = (x0 + ks[s % 3]) | 0;
|
|
37
|
+
x1 = (x1 + ks[(s + 1) % 3] + s) | 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
out[0] = x0;
|
|
41
|
+
out[1] = x1;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=threefry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threefry.js","sourceRoot":"","sources":["../../../src/random/threefry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yEAAyE;AACzE,MAAM,SAAS,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAU,CAAC;AAE3D,+DAA+D;AAC/D,MAAM,SAAS,GAAG,UAAU,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,GAAgB;IACzF,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;IACrB,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;IACrB,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3B,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QACtC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnB,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/B,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,EAAE,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5B,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1B,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;IACL,CAAC;IACD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACZ,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The cosine and sine of a uniformly drawn angle, the same bits on every engine.
|
|
3
|
+
*
|
|
4
|
+
* The angle is given as a turn fraction u in [0, 1) (angle 2 pi u), so the argument reduction is
|
|
5
|
+
* exact: 8u splits into an octant k and a fraction f without rounding, and only f * pi / 4 rounds
|
|
6
|
+
* once. On [0, pi / 4] the polynomials are fdlibm's `__kernel_sin` and `__kernel_cos` (FreeBSD
|
|
7
|
+
* k_sin.c and k_cos.c, Sun Microsystems 1993) with a zero tail, evaluated with the four basic
|
|
8
|
+
* operations only. Error a few ulp; bit-identical everywhere.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* cos(2 pi u) and sin(2 pi u).
|
|
12
|
+
* @param u - the turn fraction, in [0, 1)
|
|
13
|
+
* @param out - receives [cos, sin]
|
|
14
|
+
*/
|
|
15
|
+
export declare function detCosSinTurn(u: number, out: Float64Array): void;
|
|
16
|
+
//# sourceMappingURL=trig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trig.d.ts","sourceRoot":"","sources":["../../../src/random/trig.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2CH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CA0BhE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The cosine and sine of a uniformly drawn angle, the same bits on every engine.
|
|
3
|
+
*
|
|
4
|
+
* The angle is given as a turn fraction u in [0, 1) (angle 2 pi u), so the argument reduction is
|
|
5
|
+
* exact: 8u splits into an octant k and a fraction f without rounding, and only f * pi / 4 rounds
|
|
6
|
+
* once. On [0, pi / 4] the polynomials are fdlibm's `__kernel_sin` and `__kernel_cos` (FreeBSD
|
|
7
|
+
* k_sin.c and k_cos.c, Sun Microsystems 1993) with a zero tail, evaluated with the four basic
|
|
8
|
+
* operations only. Error a few ulp; bit-identical everywhere.
|
|
9
|
+
*/
|
|
10
|
+
const PIO4 = 7.85398163397448278999e-1;
|
|
11
|
+
const S1 = -1.66666666666666324348e-1;
|
|
12
|
+
const S2 = 8.33333333332248946124e-3;
|
|
13
|
+
const S3 = -1.98412698298579493134e-4;
|
|
14
|
+
const S4 = 2.75573137070700676789e-6;
|
|
15
|
+
const S5 = -2.50507602534068634195e-8;
|
|
16
|
+
const S6 = 1.58969099521155010221e-10;
|
|
17
|
+
const C1 = 4.16666666666666019037e-2;
|
|
18
|
+
const C2 = -1.38888888888741095749e-3;
|
|
19
|
+
const C3 = 2.48015872894767294178e-5;
|
|
20
|
+
const C4 = -2.75573143513906633035e-7;
|
|
21
|
+
const C5 = 2.08757232129817482790e-9;
|
|
22
|
+
const C6 = -1.13596475577881948265e-11;
|
|
23
|
+
/**
|
|
24
|
+
* sin(x) for |x| <= pi / 4.
|
|
25
|
+
* @param x - the argument
|
|
26
|
+
* @returns the sine
|
|
27
|
+
*/
|
|
28
|
+
function kernelSin(x) {
|
|
29
|
+
const z = x * x;
|
|
30
|
+
const r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6)));
|
|
31
|
+
return x + z * x * (S1 + z * r);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* cos(x) for |x| <= pi / 4.
|
|
35
|
+
* @param x - the argument
|
|
36
|
+
* @returns the cosine
|
|
37
|
+
*/
|
|
38
|
+
function kernelCos(x) {
|
|
39
|
+
const z = x * x;
|
|
40
|
+
const w = z * z;
|
|
41
|
+
const r = z * (C1 + z * (C2 + z * C3)) + w * w * (C4 + z * (C5 + z * C6));
|
|
42
|
+
const hz = 0.5 * z;
|
|
43
|
+
const v = 1.0 - hz;
|
|
44
|
+
return v + (1.0 - v - hz + z * r);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* cos(2 pi u) and sin(2 pi u).
|
|
48
|
+
* @param u - the turn fraction, in [0, 1)
|
|
49
|
+
* @param out - receives [cos, sin]
|
|
50
|
+
*/
|
|
51
|
+
export function detCosSinTurn(u, out) {
|
|
52
|
+
const t = u * 8;
|
|
53
|
+
const octant = Math.floor(t);
|
|
54
|
+
const x = (t - octant) * PIO4;
|
|
55
|
+
// the octant's angle is (octant >> 1) quarter turns plus x (even octant) or pi/2 - (pi/4 - x)
|
|
56
|
+
const odd = (octant & 1) === 1;
|
|
57
|
+
const z = odd ? PIO4 - x : x;
|
|
58
|
+
const c = odd ? kernelSin(z) : kernelCos(z);
|
|
59
|
+
const s = odd ? kernelCos(z) : kernelSin(z);
|
|
60
|
+
switch ((octant >> 1) & 3) {
|
|
61
|
+
case 0:
|
|
62
|
+
out[0] = c;
|
|
63
|
+
out[1] = s;
|
|
64
|
+
break;
|
|
65
|
+
case 1:
|
|
66
|
+
out[0] = -s;
|
|
67
|
+
out[1] = c;
|
|
68
|
+
break;
|
|
69
|
+
case 2:
|
|
70
|
+
out[0] = -c;
|
|
71
|
+
out[1] = -s;
|
|
72
|
+
break;
|
|
73
|
+
default:
|
|
74
|
+
out[0] = s;
|
|
75
|
+
out[1] = -c;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=trig.js.map
|