@graphty/graph-samples 0.0.1 → 0.1.1

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.
Files changed (407) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +123 -0
  3. package/README.md +190 -1
  4. package/dist/chunks/build-DdCe60t3.js +47 -0
  5. package/dist/chunks/build-DdCe60t3.js.map +1 -0
  6. package/dist/chunks/meta-B6toBzaa.js +19 -0
  7. package/dist/chunks/meta-B6toBzaa.js.map +1 -0
  8. package/dist/chunks/meta-BM_YIhlA.js +28 -0
  9. package/dist/chunks/meta-BM_YIhlA.js.map +1 -0
  10. package/dist/chunks/meta-BMmtUpPx.js +30 -0
  11. package/dist/chunks/meta-BMmtUpPx.js.map +1 -0
  12. package/dist/chunks/meta-BXC7oi86.js +22 -0
  13. package/dist/chunks/meta-BXC7oi86.js.map +1 -0
  14. package/dist/chunks/meta-BaFPvhc1.js +19 -0
  15. package/dist/chunks/meta-BaFPvhc1.js.map +1 -0
  16. package/dist/chunks/meta-C58v1Oy0.js +28 -0
  17. package/dist/chunks/meta-C58v1Oy0.js.map +1 -0
  18. package/dist/chunks/meta-CQRXyexG.js +23 -0
  19. package/dist/chunks/meta-CQRXyexG.js.map +1 -0
  20. package/dist/chunks/meta-DrgM1eS0.js +23 -0
  21. package/dist/chunks/meta-DrgM1eS0.js.map +1 -0
  22. package/dist/chunks/meta-IhoaDXAV.js +19 -0
  23. package/dist/chunks/meta-IhoaDXAV.js.map +1 -0
  24. package/dist/chunks/meta-MQPbBUUB.js +29 -0
  25. package/dist/chunks/meta-MQPbBUUB.js.map +1 -0
  26. package/dist/chunks/meta-Qp4HNYAZ.js +24 -0
  27. package/dist/chunks/meta-Qp4HNYAZ.js.map +1 -0
  28. package/dist/chunks/meta-mns0uFIW.js +19 -0
  29. package/dist/chunks/meta-mns0uFIW.js.map +1 -0
  30. package/dist/datasets/celegans-neural.d.ts +1 -0
  31. package/dist/datasets/celegans-neural.js +7359 -0
  32. package/dist/datasets/celegans-neural.js.map +1 -0
  33. package/dist/datasets/contiguous-usa.d.ts +1 -0
  34. package/dist/datasets/contiguous-usa.js +501 -0
  35. package/dist/datasets/contiguous-usa.js.map +1 -0
  36. package/dist/datasets/davis-southern-women.d.ts +1 -0
  37. package/dist/datasets/davis-southern-women.js +235 -0
  38. package/dist/datasets/davis-southern-women.js.map +1 -0
  39. package/dist/datasets/dolphins.d.ts +1 -0
  40. package/dist/datasets/dolphins.js +406 -0
  41. package/dist/datasets/dolphins.js.map +1 -0
  42. package/dist/datasets/florentine-families.d.ts +1 -0
  43. package/dist/datasets/florentine-families.js +75 -0
  44. package/dist/datasets/florentine-families.js.map +1 -0
  45. package/dist/datasets/football.d.ts +1 -0
  46. package/dist/datasets/football.js +1508 -0
  47. package/dist/datasets/football.js.map +1 -0
  48. package/dist/datasets/karate.d.ts +1 -0
  49. package/dist/datasets/karate.js +295 -0
  50. package/dist/datasets/karate.js.map +1 -0
  51. package/dist/datasets/knuth-miles.d.ts +1 -0
  52. package/dist/datasets/knuth-miles.js +24933 -0
  53. package/dist/datasets/knuth-miles.js.map +1 -0
  54. package/dist/datasets/les-miserables.d.ts +1 -0
  55. package/dist/datasets/les-miserables.js +860 -0
  56. package/dist/datasets/les-miserables.js.map +1 -0
  57. package/dist/datasets/openflights.d.ts +1 -0
  58. package/dist/datasets/openflights.js +130277 -0
  59. package/dist/datasets/openflights.js.map +1 -0
  60. package/dist/datasets/political-blogs.d.ts +1 -0
  61. package/dist/datasets/political-blogs.js +42551 -0
  62. package/dist/datasets/political-blogs.js.map +1 -0
  63. package/dist/datasets/political-books.d.ts +1 -0
  64. package/dist/datasets/political-books.js +1124 -0
  65. package/dist/datasets/political-books.js.map +1 -0
  66. package/dist/generators.d.ts +1 -0
  67. package/dist/generators.js +4496 -0
  68. package/dist/generators.js.map +1 -0
  69. package/dist/graph-samples.d.ts +1 -0
  70. package/dist/graph-samples.js +142 -0
  71. package/dist/graph-samples.js.map +1 -0
  72. package/dist/src/datasets/build.d.ts +89 -0
  73. package/dist/src/datasets/build.d.ts.map +1 -0
  74. package/dist/src/datasets/build.js +53 -0
  75. package/dist/src/datasets/build.js.map +1 -0
  76. package/dist/src/datasets/catalog.d.ts +8 -0
  77. package/dist/src/datasets/catalog.d.ts.map +1 -0
  78. package/dist/src/datasets/catalog.js +34 -0
  79. package/dist/src/datasets/catalog.js.map +1 -0
  80. package/dist/src/datasets/celegans-neural/data.d.ts +3 -0
  81. package/dist/src/datasets/celegans-neural/data.d.ts.map +1 -0
  82. package/dist/src/datasets/celegans-neural/data.js +573 -0
  83. package/dist/src/datasets/celegans-neural/data.js.map +1 -0
  84. package/dist/src/datasets/celegans-neural/index.d.ts +11 -0
  85. package/dist/src/datasets/celegans-neural/index.d.ts.map +1 -0
  86. package/dist/src/datasets/celegans-neural/index.js +14 -0
  87. package/dist/src/datasets/celegans-neural/index.js.map +1 -0
  88. package/dist/src/datasets/celegans-neural/meta.d.ts +4 -0
  89. package/dist/src/datasets/celegans-neural/meta.d.ts.map +1 -0
  90. package/dist/src/datasets/celegans-neural/meta.js +21 -0
  91. package/dist/src/datasets/celegans-neural/meta.js.map +1 -0
  92. package/dist/src/datasets/contiguous-usa/data.d.ts +3 -0
  93. package/dist/src/datasets/contiguous-usa/data.d.ts.map +1 -0
  94. package/dist/src/datasets/contiguous-usa/data.js +162 -0
  95. package/dist/src/datasets/contiguous-usa/data.js.map +1 -0
  96. package/dist/src/datasets/contiguous-usa/index.d.ts +11 -0
  97. package/dist/src/datasets/contiguous-usa/index.d.ts.map +1 -0
  98. package/dist/src/datasets/contiguous-usa/index.js +14 -0
  99. package/dist/src/datasets/contiguous-usa/index.js.map +1 -0
  100. package/dist/src/datasets/contiguous-usa/meta.d.ts +4 -0
  101. package/dist/src/datasets/contiguous-usa/meta.d.ts.map +1 -0
  102. package/dist/src/datasets/contiguous-usa/meta.js +27 -0
  103. package/dist/src/datasets/contiguous-usa/meta.js.map +1 -0
  104. package/dist/src/datasets/davis-southern-women/data.d.ts +3 -0
  105. package/dist/src/datasets/davis-southern-women/data.d.ts.map +1 -0
  106. package/dist/src/datasets/davis-southern-women/data.js +57 -0
  107. package/dist/src/datasets/davis-southern-women/data.js.map +1 -0
  108. package/dist/src/datasets/davis-southern-women/index.d.ts +11 -0
  109. package/dist/src/datasets/davis-southern-women/index.d.ts.map +1 -0
  110. package/dist/src/datasets/davis-southern-women/index.js +14 -0
  111. package/dist/src/datasets/davis-southern-women/index.js.map +1 -0
  112. package/dist/src/datasets/davis-southern-women/meta.d.ts +4 -0
  113. package/dist/src/datasets/davis-southern-women/meta.d.ts.map +1 -0
  114. package/dist/src/datasets/davis-southern-women/meta.js +17 -0
  115. package/dist/src/datasets/davis-southern-women/meta.js.map +1 -0
  116. package/dist/src/datasets/dolphins/data.d.ts +3 -0
  117. package/dist/src/datasets/dolphins/data.d.ts.map +1 -0
  118. package/dist/src/datasets/dolphins/data.js +93 -0
  119. package/dist/src/datasets/dolphins/data.js.map +1 -0
  120. package/dist/src/datasets/dolphins/index.d.ts +11 -0
  121. package/dist/src/datasets/dolphins/index.d.ts.map +1 -0
  122. package/dist/src/datasets/dolphins/index.js +14 -0
  123. package/dist/src/datasets/dolphins/index.js.map +1 -0
  124. package/dist/src/datasets/dolphins/meta.d.ts +4 -0
  125. package/dist/src/datasets/dolphins/meta.d.ts.map +1 -0
  126. package/dist/src/datasets/dolphins/meta.js +17 -0
  127. package/dist/src/datasets/dolphins/meta.js.map +1 -0
  128. package/dist/src/datasets/florentine-families/data.d.ts +3 -0
  129. package/dist/src/datasets/florentine-families/data.d.ts.map +1 -0
  130. package/dist/src/datasets/florentine-families/data.js +31 -0
  131. package/dist/src/datasets/florentine-families/data.js.map +1 -0
  132. package/dist/src/datasets/florentine-families/index.d.ts +11 -0
  133. package/dist/src/datasets/florentine-families/index.d.ts.map +1 -0
  134. package/dist/src/datasets/florentine-families/index.js +14 -0
  135. package/dist/src/datasets/florentine-families/index.js.map +1 -0
  136. package/dist/src/datasets/florentine-families/meta.d.ts +4 -0
  137. package/dist/src/datasets/florentine-families/meta.d.ts.map +1 -0
  138. package/dist/src/datasets/florentine-families/meta.js +17 -0
  139. package/dist/src/datasets/florentine-families/meta.js.map +1 -0
  140. package/dist/src/datasets/football/data.d.ts +3 -0
  141. package/dist/src/datasets/football/data.d.ts.map +1 -0
  142. package/dist/src/datasets/football/data.js +210 -0
  143. package/dist/src/datasets/football/data.js.map +1 -0
  144. package/dist/src/datasets/football/index.d.ts +11 -0
  145. package/dist/src/datasets/football/index.d.ts.map +1 -0
  146. package/dist/src/datasets/football/index.js +14 -0
  147. package/dist/src/datasets/football/index.js.map +1 -0
  148. package/dist/src/datasets/football/meta.d.ts +4 -0
  149. package/dist/src/datasets/football/meta.d.ts.map +1 -0
  150. package/dist/src/datasets/football/meta.js +17 -0
  151. package/dist/src/datasets/football/meta.js.map +1 -0
  152. package/dist/src/datasets/hosted.d.ts +7 -0
  153. package/dist/src/datasets/hosted.d.ts.map +1 -0
  154. package/dist/src/datasets/hosted.js +80 -0
  155. package/dist/src/datasets/hosted.js.map +1 -0
  156. package/dist/src/datasets/karate/data.d.ts +3 -0
  157. package/dist/src/datasets/karate/data.d.ts.map +1 -0
  158. package/dist/src/datasets/karate/data.js +30 -0
  159. package/dist/src/datasets/karate/data.js.map +1 -0
  160. package/dist/src/datasets/karate/index.d.ts +11 -0
  161. package/dist/src/datasets/karate/index.d.ts.map +1 -0
  162. package/dist/src/datasets/karate/index.js +14 -0
  163. package/dist/src/datasets/karate/index.js.map +1 -0
  164. package/dist/src/datasets/karate/meta.d.ts +4 -0
  165. package/dist/src/datasets/karate/meta.d.ts.map +1 -0
  166. package/dist/src/datasets/karate/meta.js +22 -0
  167. package/dist/src/datasets/karate/meta.js.map +1 -0
  168. package/dist/src/datasets/knuth-miles/data.d.ts +3 -0
  169. package/dist/src/datasets/knuth-miles/data.d.ts.map +1 -0
  170. package/dist/src/datasets/knuth-miles/data.js +1203 -0
  171. package/dist/src/datasets/knuth-miles/data.js.map +1 -0
  172. package/dist/src/datasets/knuth-miles/index.d.ts +11 -0
  173. package/dist/src/datasets/knuth-miles/index.d.ts.map +1 -0
  174. package/dist/src/datasets/knuth-miles/index.js +14 -0
  175. package/dist/src/datasets/knuth-miles/index.js.map +1 -0
  176. package/dist/src/datasets/knuth-miles/meta.d.ts +4 -0
  177. package/dist/src/datasets/knuth-miles/meta.d.ts.map +1 -0
  178. package/dist/src/datasets/knuth-miles/meta.js +26 -0
  179. package/dist/src/datasets/knuth-miles/meta.js.map +1 -0
  180. package/dist/src/datasets/les-miserables/data.d.ts +3 -0
  181. package/dist/src/datasets/les-miserables/data.d.ts.map +1 -0
  182. package/dist/src/datasets/les-miserables/data.js +117 -0
  183. package/dist/src/datasets/les-miserables/data.js.map +1 -0
  184. package/dist/src/datasets/les-miserables/index.d.ts +11 -0
  185. package/dist/src/datasets/les-miserables/index.d.ts.map +1 -0
  186. package/dist/src/datasets/les-miserables/index.js +14 -0
  187. package/dist/src/datasets/les-miserables/index.js.map +1 -0
  188. package/dist/src/datasets/les-miserables/meta.d.ts +4 -0
  189. package/dist/src/datasets/les-miserables/meta.d.ts.map +1 -0
  190. package/dist/src/datasets/les-miserables/meta.js +21 -0
  191. package/dist/src/datasets/les-miserables/meta.js.map +1 -0
  192. package/dist/src/datasets/openflights/data.d.ts +3 -0
  193. package/dist/src/datasets/openflights/data.d.ts.map +1 -0
  194. package/dist/src/datasets/openflights/data.js +15457 -0
  195. package/dist/src/datasets/openflights/data.js.map +1 -0
  196. package/dist/src/datasets/openflights/index.d.ts +11 -0
  197. package/dist/src/datasets/openflights/index.d.ts.map +1 -0
  198. package/dist/src/datasets/openflights/index.js +14 -0
  199. package/dist/src/datasets/openflights/index.js.map +1 -0
  200. package/dist/src/datasets/openflights/meta.d.ts +4 -0
  201. package/dist/src/datasets/openflights/meta.d.ts.map +1 -0
  202. package/dist/src/datasets/openflights/meta.js +28 -0
  203. package/dist/src/datasets/openflights/meta.js.map +1 -0
  204. package/dist/src/datasets/political-blogs/data.d.ts +3 -0
  205. package/dist/src/datasets/political-blogs/data.d.ts.map +1 -0
  206. package/dist/src/datasets/political-blogs/data.js +4857 -0
  207. package/dist/src/datasets/political-blogs/data.js.map +1 -0
  208. package/dist/src/datasets/political-blogs/index.d.ts +11 -0
  209. package/dist/src/datasets/political-blogs/index.d.ts.map +1 -0
  210. package/dist/src/datasets/political-blogs/index.js +14 -0
  211. package/dist/src/datasets/political-blogs/index.js.map +1 -0
  212. package/dist/src/datasets/political-blogs/meta.d.ts +4 -0
  213. package/dist/src/datasets/political-blogs/meta.d.ts.map +1 -0
  214. package/dist/src/datasets/political-blogs/meta.js +26 -0
  215. package/dist/src/datasets/political-blogs/meta.js.map +1 -0
  216. package/dist/src/datasets/political-books/data.d.ts +3 -0
  217. package/dist/src/datasets/political-books/data.d.ts.map +1 -0
  218. package/dist/src/datasets/political-books/data.js +165 -0
  219. package/dist/src/datasets/political-books/data.js.map +1 -0
  220. package/dist/src/datasets/political-books/index.d.ts +11 -0
  221. package/dist/src/datasets/political-books/index.d.ts.map +1 -0
  222. package/dist/src/datasets/political-books/index.js +14 -0
  223. package/dist/src/datasets/political-books/index.js.map +1 -0
  224. package/dist/src/datasets/political-books/meta.d.ts +4 -0
  225. package/dist/src/datasets/political-books/meta.d.ts.map +1 -0
  226. package/dist/src/datasets/political-books/meta.js +20 -0
  227. package/dist/src/datasets/political-books/meta.js.map +1 -0
  228. package/dist/src/datasets/remote.d.ts +27 -0
  229. package/dist/src/datasets/remote.d.ts.map +1 -0
  230. package/dist/src/datasets/remote.js +30 -0
  231. package/dist/src/datasets/remote.js.map +1 -0
  232. package/dist/src/element.d.ts +20 -0
  233. package/dist/src/element.d.ts.map +1 -0
  234. package/dist/src/element.js +27 -0
  235. package/dist/src/element.js.map +1 -0
  236. package/dist/src/generators/bipartite.d.ts +51 -0
  237. package/dist/src/generators/bipartite.d.ts.map +1 -0
  238. package/dist/src/generators/bipartite.js +99 -0
  239. package/dist/src/generators/bipartite.js.map +1 -0
  240. package/dist/src/generators/block-model.d.ts +75 -0
  241. package/dist/src/generators/block-model.d.ts.map +1 -0
  242. package/dist/src/generators/block-model.js +116 -0
  243. package/dist/src/generators/block-model.js.map +1 -0
  244. package/dist/src/generators/classic.d.ts +208 -0
  245. package/dist/src/generators/classic.d.ts.map +1 -0
  246. package/dist/src/generators/classic.js +437 -0
  247. package/dist/src/generators/classic.js.map +1 -0
  248. package/dist/src/generators/degree-sequence.d.ts +273 -0
  249. package/dist/src/generators/degree-sequence.d.ts.map +1 -0
  250. package/dist/src/generators/degree-sequence.js +646 -0
  251. package/dist/src/generators/degree-sequence.js.map +1 -0
  252. package/dist/src/generators/directed.d.ts +141 -0
  253. package/dist/src/generators/directed.d.ts.map +1 -0
  254. package/dist/src/generators/directed.js +329 -0
  255. package/dist/src/generators/directed.js.map +1 -0
  256. package/dist/src/generators/erdos-renyi.d.ts +58 -0
  257. package/dist/src/generators/erdos-renyi.d.ts.map +1 -0
  258. package/dist/src/generators/erdos-renyi.js +154 -0
  259. package/dist/src/generators/erdos-renyi.js.map +1 -0
  260. package/dist/src/generators/flow.d.ts +153 -0
  261. package/dist/src/generators/flow.d.ts.map +1 -0
  262. package/dist/src/generators/flow.js +346 -0
  263. package/dist/src/generators/flow.js.map +1 -0
  264. package/dist/src/generators/geometric.d.ts +133 -0
  265. package/dist/src/generators/geometric.d.ts.map +1 -0
  266. package/dist/src/generators/geometric.js +495 -0
  267. package/dist/src/generators/geometric.js.map +1 -0
  268. package/dist/src/generators/growth.d.ts +187 -0
  269. package/dist/src/generators/growth.d.ts.map +1 -0
  270. package/dist/src/generators/growth.js +445 -0
  271. package/dist/src/generators/growth.js.map +1 -0
  272. package/dist/src/generators/hyperbolic.d.ts +84 -0
  273. package/dist/src/generators/hyperbolic.d.ts.map +1 -0
  274. package/dist/src/generators/hyperbolic.js +153 -0
  275. package/dist/src/generators/hyperbolic.js.map +1 -0
  276. package/dist/src/generators/index.d.ts +25 -0
  277. package/dist/src/generators/index.d.ts.map +1 -0
  278. package/dist/src/generators/index.js +24 -0
  279. package/dist/src/generators/index.js.map +1 -0
  280. package/dist/src/generators/lattices.d.ts +87 -0
  281. package/dist/src/generators/lattices.d.ts.map +1 -0
  282. package/dist/src/generators/lattices.js +237 -0
  283. package/dist/src/generators/lattices.js.map +1 -0
  284. package/dist/src/generators/lfr.d.ts +55 -0
  285. package/dist/src/generators/lfr.d.ts.map +1 -0
  286. package/dist/src/generators/lfr.js +178 -0
  287. package/dist/src/generators/lfr.js.map +1 -0
  288. package/dist/src/generators/named.d.ts +23 -0
  289. package/dist/src/generators/named.d.ts.map +1 -0
  290. package/dist/src/generators/named.js +191 -0
  291. package/dist/src/generators/named.js.map +1 -0
  292. package/dist/src/generators/preferential-attachment.d.ts +66 -0
  293. package/dist/src/generators/preferential-attachment.d.ts.map +1 -0
  294. package/dist/src/generators/preferential-attachment.js +157 -0
  295. package/dist/src/generators/preferential-attachment.js.map +1 -0
  296. package/dist/src/generators/trees-and-dags.d.ts +53 -0
  297. package/dist/src/generators/trees-and-dags.d.ts.map +1 -0
  298. package/dist/src/generators/trees-and-dags.js +108 -0
  299. package/dist/src/generators/trees-and-dags.js.map +1 -0
  300. package/dist/src/generators/util.d.ts +84 -0
  301. package/dist/src/generators/util.d.ts.map +1 -0
  302. package/dist/src/generators/util.js +138 -0
  303. package/dist/src/generators/util.js.map +1 -0
  304. package/dist/src/generators/variants.d.ts +85 -0
  305. package/dist/src/generators/variants.d.ts.map +1 -0
  306. package/dist/src/generators/variants.js +215 -0
  307. package/dist/src/generators/variants.js.map +1 -0
  308. package/dist/src/generators/weights.d.ts +65 -0
  309. package/dist/src/generators/weights.d.ts.map +1 -0
  310. package/dist/src/generators/weights.js +135 -0
  311. package/dist/src/generators/weights.js.map +1 -0
  312. package/dist/src/index.d.ts +12 -0
  313. package/dist/src/index.d.ts.map +1 -0
  314. package/dist/src/index.js +10 -0
  315. package/dist/src/index.js.map +1 -0
  316. package/dist/src/random/exp.d.ts +23 -0
  317. package/dist/src/random/exp.d.ts.map +1 -0
  318. package/dist/src/random/exp.js +101 -0
  319. package/dist/src/random/exp.js.map +1 -0
  320. package/dist/src/random/log.d.ts +19 -0
  321. package/dist/src/random/log.d.ts.map +1 -0
  322. package/dist/src/random/log.js +83 -0
  323. package/dist/src/random/log.js.map +1 -0
  324. package/dist/src/random/stream.d.ts +93 -0
  325. package/dist/src/random/stream.d.ts.map +1 -0
  326. package/dist/src/random/stream.js +154 -0
  327. package/dist/src/random/stream.js.map +1 -0
  328. package/dist/src/random/threefry.d.ts +19 -0
  329. package/dist/src/random/threefry.d.ts.map +1 -0
  330. package/dist/src/random/threefry.js +43 -0
  331. package/dist/src/random/threefry.js.map +1 -0
  332. package/dist/src/random/trig.d.ts +16 -0
  333. package/dist/src/random/trig.d.ts.map +1 -0
  334. package/dist/src/random/trig.js +78 -0
  335. package/dist/src/random/trig.js.map +1 -0
  336. package/dist/src/types.d.ts +28 -0
  337. package/dist/src/types.d.ts.map +1 -0
  338. package/dist/src/types.js +2 -0
  339. package/dist/src/types.js.map +1 -0
  340. package/package.json +102 -5
  341. package/src/datasets/build.ts +140 -0
  342. package/src/datasets/catalog.ts +35 -0
  343. package/src/datasets/celegans-neural/data.ts +575 -0
  344. package/src/datasets/celegans-neural/index.ts +17 -0
  345. package/src/datasets/celegans-neural/meta.ts +25 -0
  346. package/src/datasets/contiguous-usa/data.ts +164 -0
  347. package/src/datasets/contiguous-usa/index.ts +17 -0
  348. package/src/datasets/contiguous-usa/meta.ts +31 -0
  349. package/src/datasets/davis-southern-women/data.ts +59 -0
  350. package/src/datasets/davis-southern-women/index.ts +17 -0
  351. package/src/datasets/davis-southern-women/meta.ts +20 -0
  352. package/src/datasets/dolphins/data.ts +95 -0
  353. package/src/datasets/dolphins/index.ts +17 -0
  354. package/src/datasets/dolphins/meta.ts +21 -0
  355. package/src/datasets/florentine-families/data.ts +33 -0
  356. package/src/datasets/florentine-families/index.ts +17 -0
  357. package/src/datasets/florentine-families/meta.ts +20 -0
  358. package/src/datasets/football/data.ts +212 -0
  359. package/src/datasets/football/index.ts +17 -0
  360. package/src/datasets/football/meta.ts +20 -0
  361. package/src/datasets/hosted.ts +90 -0
  362. package/src/datasets/karate/data.ts +32 -0
  363. package/src/datasets/karate/index.ts +17 -0
  364. package/src/datasets/karate/meta.ts +25 -0
  365. package/src/datasets/knuth-miles/data.ts +1205 -0
  366. package/src/datasets/knuth-miles/index.ts +17 -0
  367. package/src/datasets/knuth-miles/meta.ts +29 -0
  368. package/src/datasets/les-miserables/data.ts +119 -0
  369. package/src/datasets/les-miserables/index.ts +17 -0
  370. package/src/datasets/les-miserables/meta.ts +24 -0
  371. package/src/datasets/openflights/data.ts +15459 -0
  372. package/src/datasets/openflights/index.ts +17 -0
  373. package/src/datasets/openflights/meta.ts +31 -0
  374. package/src/datasets/political-blogs/data.ts +4859 -0
  375. package/src/datasets/political-blogs/index.ts +17 -0
  376. package/src/datasets/political-blogs/meta.ts +30 -0
  377. package/src/datasets/political-books/data.ts +167 -0
  378. package/src/datasets/political-books/index.ts +17 -0
  379. package/src/datasets/political-books/meta.ts +23 -0
  380. package/src/datasets/remote.ts +42 -0
  381. package/src/element.ts +41 -0
  382. package/src/generators/bipartite.ts +127 -0
  383. package/src/generators/block-model.ts +160 -0
  384. package/src/generators/classic.ts +461 -0
  385. package/src/generators/degree-sequence.ts +807 -0
  386. package/src/generators/directed.ts +418 -0
  387. package/src/generators/erdos-renyi.ts +188 -0
  388. package/src/generators/flow.ts +443 -0
  389. package/src/generators/geometric.ts +591 -0
  390. package/src/generators/growth.ts +532 -0
  391. package/src/generators/hyperbolic.ts +193 -0
  392. package/src/generators/index.ts +133 -0
  393. package/src/generators/lattices.ts +290 -0
  394. package/src/generators/lfr.ts +227 -0
  395. package/src/generators/named.ts +198 -0
  396. package/src/generators/preferential-attachment.ts +188 -0
  397. package/src/generators/trees-and-dags.ts +139 -0
  398. package/src/generators/util.ts +167 -0
  399. package/src/generators/variants.ts +253 -0
  400. package/src/generators/weights.ts +177 -0
  401. package/src/index.ts +12 -0
  402. package/src/random/exp.ts +104 -0
  403. package/src/random/log.ts +86 -0
  404. package/src/random/stream.ts +169 -0
  405. package/src/random/threefry.ts +45 -0
  406. package/src/random/trig.ts +83 -0
  407. package/src/types.ts +28 -0
@@ -0,0 +1,418 @@
1
+ /**
2
+ * Directed random graphs: stochastic Kronecker graphs and R-MAT (the recursive-matrix family behind
3
+ * the Graph500 benchmark), Price's citation network and the random-order DAG.
4
+ */
5
+
6
+ import { type U32 } from "@graphty/graph-format";
7
+
8
+ import { detLog } from "../random/log.js";
9
+ import { RandomStream, resolveSeed } from "../random/stream.js";
10
+ import { type SampleGraph } from "../types.js";
11
+ import { type EdgePolicy } from "./degree-sequence.js";
12
+ import {
13
+ bernoulliSegment,
14
+ binomialBuffer,
15
+ checkEdgeCount,
16
+ checkInt,
17
+ checkProbability,
18
+ EdgeBuffer,
19
+ toGraph,
20
+ } from "./util.js";
21
+ import { applyWeights, type WeightOptions } from "./weights.js";
22
+
23
+ /** The options R-MAT and Kronecker graphs share. */
24
+ interface RecursiveOptions extends WeightOptions {
25
+ /** Self-loops: "keep" (the default) or "erase" them. */
26
+ selfLoops?: EdgePolicy | undefined;
27
+ /**
28
+ * Repeated pairs: "keep" (the default) or "erase" all but the first occurrence in edge order.
29
+ * For an undirected graph (u, v) and (v, u) are the same pair.
30
+ */
31
+ multiEdges?: EdgePolicy | undefined;
32
+ /** Relabel the nodes by a uniformly random permutation, as Graph500 does; default false. */
33
+ permute?: boolean | undefined;
34
+ /** Whether the graph is directed; default true. */
35
+ directed?: boolean | undefined;
36
+ /** The seed, an integer in [0, 2^53); default 0. */
37
+ seed?: number | undefined;
38
+ }
39
+
40
+ /**
41
+ * Throw unless `value` is undefined or a duplicate policy.
42
+ * @param name - the option name
43
+ * @param value - the value
44
+ */
45
+ function checkPolicy(name: string, value: EdgePolicy | undefined): void {
46
+ if (value !== undefined && value !== "keep" && value !== "erase") {
47
+ throw new RangeError(`${name} must be "keep" or "erase", got ${String(value)}`);
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Apply `permute`, `selfLoops` and `multiEdges` to freshly sampled edges, then build the graph.
53
+ * The permutation is a Fisher-Yates shuffle of 0 .. n - 1 (for i = n - 1 down to 1, swap i with
54
+ * nextBelow(i + 1)) from stream (seed, permuteDomain, 0); node u becomes perm[u]. Erasing keeps
55
+ * the first occurrence of a pair in edge order, and is not affected by the relabelling.
56
+ * @param n - the node count
57
+ * @param src - the sources, in edge order
58
+ * @param dst - the targets
59
+ * @param options - the options
60
+ * @param seed - the resolved seed
61
+ * @param permuteDomain - the permutation's stream domain
62
+ * @returns the graph (before weights)
63
+ */
64
+ function finishRecursive(
65
+ n: number,
66
+ src: U32,
67
+ dst: U32,
68
+ options: RecursiveOptions,
69
+ seed: number,
70
+ permuteDomain: string,
71
+ ): SampleGraph {
72
+ const directed = options.directed ?? true;
73
+ const m = src.length;
74
+ if (options.permute === true) {
75
+ const perm = new Uint32Array(n);
76
+ for (let i = 0; i < n; i++) {
77
+ perm[i] = i;
78
+ }
79
+ const stream = new RandomStream(seed, permuteDomain, 0);
80
+ for (let i = n - 1; i > 0; i--) {
81
+ const j = stream.nextBelow(i + 1);
82
+ const t = perm[i];
83
+ perm[i] = perm[j];
84
+ perm[j] = t;
85
+ }
86
+ for (let e = 0; e < m; e++) {
87
+ src[e] = perm[src[e]];
88
+ dst[e] = perm[dst[e]];
89
+ }
90
+ }
91
+ const keep = new Uint8Array(m).fill(1);
92
+ if (options.selfLoops === "erase") {
93
+ for (let e = 0; e < m; e++) {
94
+ if (src[e] === dst[e]) {
95
+ keep[e] = 0;
96
+ }
97
+ }
98
+ }
99
+ if (options.multiEdges === "erase") {
100
+ const lo = directed ? src : src.map((u, e) => Math.min(u, dst[e]));
101
+ const hi = directed ? dst : src.map((u, e) => Math.max(u, dst[e]));
102
+ // ponytail: O(m log m) comparator sort of edge indices; a hash set if erasing 100M+ edges matters
103
+ const order = new Uint32Array(m);
104
+ for (let e = 0; e < m; e++) {
105
+ order[e] = e;
106
+ }
107
+ order.sort((a, b) => lo[a] - lo[b] || hi[a] - hi[b] || a - b);
108
+ for (let i = 1; i < m; i++) {
109
+ const a = order[i - 1];
110
+ const b = order[i];
111
+ if (lo[a] === lo[b] && hi[a] === hi[b]) {
112
+ keep[b] = 0;
113
+ }
114
+ }
115
+ }
116
+ const out = new EdgeBuffer(m);
117
+ for (let e = 0; e < m; e++) {
118
+ if (keep[e] === 1) {
119
+ out.push(src[e], dst[e]);
120
+ }
121
+ }
122
+ return toGraph(n, out, directed);
123
+ }
124
+
125
+ /**
126
+ * Check the options R-MAT and Kronecker graphs share.
127
+ * @param options - the options
128
+ * @returns the resolved seed
129
+ */
130
+ function checkRecursive(options: RecursiveOptions): number {
131
+ checkPolicy("selfLoops", options.selfLoops);
132
+ checkPolicy("multiEdges", options.multiEdges);
133
+ return resolveSeed(options.seed);
134
+ }
135
+
136
+ /** Options of {@link kroneckerGraph}. */
137
+ export interface KroneckerOptions extends RecursiveOptions {
138
+ /** The k x k initiator matrix, k >= 1, entries in [0, 1]. */
139
+ initiator: readonly (readonly number[])[];
140
+ /** The Kronecker power, in [1, 64]; the graph has k^power nodes. */
141
+ power: number;
142
+ /** The number of edges to sample; default round((sum of the initiator)^power). */
143
+ edges?: number | undefined;
144
+ }
145
+
146
+ /**
147
+ * A stochastic Kronecker graph (J. Leskovec, D. Chakrabarti, J. Kleinberg, C. Faloutsos and
148
+ * Z. Ghahramani, "Kronecker graphs: an approach to modeling networks", JMLR 11, 985-1042, 2010)
149
+ * by their fast O(E power) sampling: n = k^power nodes and E = round(S^power) edges, S the sum of
150
+ * the initiator (S^power by repeated multiplication), unless `edges` is given. Edge e draws from
151
+ * stream (seed, "kronecker", e): `power` descents, most significant first, each drawing
152
+ * u = nextFloat() and picking the first initiator cell (row-major) whose cumulative entry over S
153
+ * exceeds u; cell (r, c) appends digit r to the source and c to the target in base k. Edges are
154
+ * listed in sampling order. A multigraph unless erased: see `selfLoops`, `multiEdges`, `permute`
155
+ * (stream (seed, "kronecker-permute", 0)) and `directed`.
156
+ * @param options - initiator, power, edges, the shared recursive options and seed
157
+ * @returns the graph
158
+ */
159
+ export function kroneckerGraph(options: KroneckerOptions): SampleGraph {
160
+ const { initiator, power } = options;
161
+ const k = initiator.length;
162
+ checkInt("initiator.length", k, 1);
163
+ let sum = 0;
164
+ for (let r = 0; r < k; r++) {
165
+ checkInt(`initiator[${r}].length`, initiator[r].length, k, k);
166
+ for (const value of initiator[r]) {
167
+ checkProbability(`initiator[${r}] entries`, value);
168
+ sum += value;
169
+ }
170
+ }
171
+ checkInt("power", power, 1, 64);
172
+ let n = 1;
173
+ let mean = 1;
174
+ for (let i = 0; i < power; i++) {
175
+ n *= k;
176
+ mean *= sum;
177
+ }
178
+ checkInt("k^power (the node count)", n, 1);
179
+ const m = options.edges ?? Math.round(mean);
180
+ checkEdgeCount(m);
181
+ checkInt("edges", m, 0);
182
+ if (m > 0 && sum === 0) {
183
+ throw new RangeError("edges must be 0 when the initiator is all zeros");
184
+ }
185
+ const seed = checkRecursive(options);
186
+ // cumulative table over S; from the last positive cell on it is exactly 1, so u < 1 always hits
187
+ const cells = k * k;
188
+ const cumulative = new Float64Array(cells);
189
+ let partial = 0;
190
+ let lastPositive = 0;
191
+ for (let i = 0; i < cells; i++) {
192
+ const value = initiator[Math.floor(i / k)][i % k];
193
+ partial += value;
194
+ cumulative[i] = partial / sum;
195
+ if (value > 0) {
196
+ lastPositive = i;
197
+ }
198
+ }
199
+ cumulative.fill(1, lastPositive);
200
+ const src = new Uint32Array(m);
201
+ const dst = new Uint32Array(m);
202
+ const stream = new RandomStream(seed, "kronecker", 0);
203
+ for (let e = 0; e < m; e++) {
204
+ stream.reset(e);
205
+ let u = 0;
206
+ let v = 0;
207
+ for (let level = 0; level < power; level++) {
208
+ const x = stream.nextFloat();
209
+ let cell = 0;
210
+ while (x >= cumulative[cell]) {
211
+ cell++;
212
+ }
213
+ u = u * k + Math.floor(cell / k);
214
+ v = v * k + (cell % k);
215
+ }
216
+ src[e] = u;
217
+ dst[e] = v;
218
+ }
219
+ return applyWeights(finishRecursive(n, src, dst, options, seed, "kronecker-permute"), options);
220
+ }
221
+
222
+ /** Options of {@link rmatGraph}. */
223
+ export interface RmatOptions extends RecursiveOptions {
224
+ /** log2 of the node count, in [0, 31]. */
225
+ scale: number;
226
+ /** Edges per node, an integer >= 0; default 16 (Graph500). */
227
+ edgeFactor?: number | undefined;
228
+ /** The top-left quadrant probability; default 0.57 (Graph500). */
229
+ a?: number | undefined;
230
+ /** The top-right quadrant probability; default 0.19. */
231
+ b?: number | undefined;
232
+ /** The bottom-left quadrant probability; default 0.19. */
233
+ c?: number | undefined;
234
+ /** The bottom-right quadrant probability; default 0.05. a + b + c + d must be 1. */
235
+ d?: number | undefined;
236
+ }
237
+
238
+ /**
239
+ * R-MAT (D. Chakrabarti, Y. Zhan and C. Faloutsos, "R-MAT: a recursive model for graph mining",
240
+ * SIAM SDM 2004, 442-446, doi:10.1137/1.9781611972740.43) with Graph500's defaults: n = 2^scale
241
+ * nodes and m = edgeFactor n edges in O(m scale). Edge e draws from stream (seed, "rmat", e):
242
+ * `scale` levels, most significant bit first, each comparing one nextFloat() with a, a + b and
243
+ * a + b + c to pick the top-left, top-right, bottom-left or else bottom-right quadrant (bit 0/1 of
244
+ * the source for top/bottom, of the target for left/right). Edges are listed in sampling order.
245
+ * A multigraph with self-loops unless erased: see `selfLoops`, `multiEdges`, `permute` (stream
246
+ * (seed, "rmat-permute", 0)) and `directed`.
247
+ *
248
+ * webgpu-graph-algorithms carries three private R-MAT copies on xorshift / LCG streams
249
+ * (benchmarks/datasets.ts, test/helpers/graphs.ts, demo/main.ts) that should move to this. Two
250
+ * of them move a self-loop to (u, (v + 1) mod n), keeping exactly m edges; `selfLoops: "erase"`
251
+ * drops the loop instead (about m / n^0.4 fewer edges at the defaults), and `weights: { kind:
252
+ * "integer", min: 1, max: 10 }` reproduces their 1..10 weights. The third keeps self-loops, which
253
+ * is this function's default.
254
+ * @param options - scale, edgeFactor, a, b, c, d, the shared recursive options and seed
255
+ * @returns the graph
256
+ */
257
+ export function rmatGraph(options: RmatOptions): SampleGraph {
258
+ const { scale } = options;
259
+ const edgeFactor = options.edgeFactor ?? 16;
260
+ const a = options.a ?? 0.57;
261
+ const b = options.b ?? 0.19;
262
+ const c = options.c ?? 0.19;
263
+ const d = options.d ?? 0.05;
264
+ checkInt("scale", scale, 0, 31);
265
+ checkInt("edgeFactor", edgeFactor, 0);
266
+ checkProbability("a", a);
267
+ checkProbability("b", b);
268
+ checkProbability("c", c);
269
+ checkProbability("d", d);
270
+ if (Math.abs(a + b + c + d - 1) > 1e-9) {
271
+ throw new RangeError(`a + b + c + d must be 1, got ${a + b + c + d}`);
272
+ }
273
+ const n = 2 ** scale;
274
+ const m = edgeFactor * n;
275
+ checkEdgeCount(m);
276
+ const seed = checkRecursive(options);
277
+ const ab = a + b;
278
+ const abc = a + b + c;
279
+ const src = new Uint32Array(m);
280
+ const dst = new Uint32Array(m);
281
+ const stream = new RandomStream(seed, "rmat", 0);
282
+ for (let e = 0; e < m; e++) {
283
+ stream.reset(e);
284
+ let u = 0;
285
+ let v = 0;
286
+ for (let level = 0; level < scale; level++) {
287
+ const x = stream.nextFloat();
288
+ u *= 2;
289
+ v *= 2;
290
+ if (x < a) {
291
+ // top-left
292
+ } else if (x < ab) {
293
+ v += 1;
294
+ } else if (x < abc) {
295
+ u += 1;
296
+ } else {
297
+ u += 1;
298
+ v += 1;
299
+ }
300
+ }
301
+ src[e] = u;
302
+ dst[e] = v;
303
+ }
304
+ return applyWeights(finishRecursive(n, src, dst, options, seed, "rmat-permute"), options);
305
+ }
306
+
307
+ /** Options of {@link priceGraph}. */
308
+ export interface PriceOptions extends WeightOptions {
309
+ /** The node count, >= 1. */
310
+ n: number;
311
+ /** The number of earlier nodes each new node cites, >= 1 (fewer while fewer exist). */
312
+ citations: number;
313
+ /** The attractiveness a > 0 added to every in-degree; default 1. */
314
+ attractiveness?: number | undefined;
315
+ /** The seed, an integer in [0, 2^53); default 0. */
316
+ seed?: number | undefined;
317
+ }
318
+
319
+ /**
320
+ * Price's citation network (D. J. de S. Price, "Networks of scientific papers", Science 149,
321
+ * 510-515, 1965, doi:10.1126/science.149.3683.510; "A general theory of bibliometric and other
322
+ * cumulative advantage processes", J. Am. Soc. Inf. Sci. 27, 292-306, 1976): a directed acyclic
323
+ * graph with arcs from the citing (newer) node to the cited (older) one, in-degrees following a
324
+ * power law with exponent 2 + a / m.
325
+ *
326
+ * Node t = 1 .. n - 1 cites min(m, t) distinct earlier nodes, each chosen with probability
327
+ * proportional to in-degree + a, the in-degrees as they were when t arrived. When t <= m it cites
328
+ * every earlier node, ascending, without drawing. Otherwise, with E arcs made before t, every draw
329
+ * takes x = nextFloat() * (E + a t) and then, if x < E, the target of a uniformly chosen earlier
330
+ * arc (nextBelow(E) into the list of cited targets), else a uniform node nextBelow(t); a node t
331
+ * already cites is redrawn. All draws come from the single stream (seed, "price", 0): the process
332
+ * is sequential. Arcs are listed by citing node, in draw order. O(n m) expected.
333
+ * @param options - n, citations, attractiveness and seed
334
+ * @returns the directed graph
335
+ */
336
+ export function priceGraph(options: PriceOptions): SampleGraph {
337
+ const { n, citations: m } = options;
338
+ const attractiveness = options.attractiveness ?? 1;
339
+ checkInt("n", n, 1);
340
+ checkInt("citations", m, 1);
341
+ if (!(attractiveness > 0 && Number.isFinite(attractiveness))) {
342
+ throw new RangeError(`attractiveness must be a positive number, got ${String(attractiveness)}`);
343
+ }
344
+ const seed = resolveSeed(options.seed);
345
+ const full = Math.min(m, n);
346
+ const edgeCount = (full * (full - 1)) / 2 + (n - full) * m;
347
+ checkEdgeCount(edgeCount);
348
+ const stream = new RandomStream(seed, "price", 0);
349
+ const out = new EdgeBuffer(edgeCount);
350
+ const citedBy = new Int32Array(n).fill(-1);
351
+ for (let t = 1; t < n; t++) {
352
+ const arcs = out.length;
353
+ if (t <= m) {
354
+ for (let v = 0; v < t; v++) {
355
+ out.push(t, v);
356
+ }
357
+ continue;
358
+ }
359
+ const total = arcs + attractiveness * t;
360
+ for (let found = 0; found < m; ) {
361
+ const x = stream.nextFloat() * total;
362
+ const v = x < arcs ? out.dst[stream.nextBelow(arcs)] : stream.nextBelow(t);
363
+ if (citedBy[v] !== t) {
364
+ citedBy[v] = t;
365
+ out.push(t, v);
366
+ found++;
367
+ }
368
+ }
369
+ }
370
+ return applyWeights(toGraph(n, out, true), options);
371
+ }
372
+
373
+ /** Options of {@link randomOrderDagGraph}. */
374
+ export interface RandomOrderDagOptions extends WeightOptions {
375
+ /** The node count, >= 0. */
376
+ n: number;
377
+ /** The probability of each arc i -> j, i < j, in [0, 1]. */
378
+ p: number;
379
+ /** The seed, an integer in [0, 2^53); default 0. */
380
+ seed?: number | undefined;
381
+ }
382
+
383
+ /**
384
+ * Rows [start, end) of the random-order DAG: row u draws from stream (seed, "order-dag", u) and
385
+ * holds the arcs u -> v, v = u + 1 .. n - 1 chosen, ascending. Any split of [0, n) into
386
+ * consecutive ranges concatenates to the whole graph's arc list.
387
+ * @param options - the generator's options (already checked)
388
+ * @param start - the first row
389
+ * @param end - one past the last row
390
+ * @param out - receives the arcs
391
+ */
392
+ export function orderDagRows(options: RandomOrderDagOptions, start: number, end: number, out: EdgeBuffer): void {
393
+ const { n, p } = options;
394
+ const logQ = detLog(1 - p);
395
+ const stream = new RandomStream(resolveSeed(options.seed), "order-dag", 0);
396
+ for (let u = start; u < end; u++) {
397
+ stream.reset(u);
398
+ bernoulliSegment(stream, p, logQ, u, u + 1, n, out);
399
+ }
400
+ }
401
+
402
+ /**
403
+ * The random-order DAG: a directed G(n, p) restricted to the arcs i -> j with i < j, so node
404
+ * index order is a topological order (B. Karrer and M. E. J. Newman, "Random acyclic networks",
405
+ * Phys. Rev. Lett. 102, 128701, 2009, doi:10.1103/PhysRevLett.102.128701). O(n + m) by geometric
406
+ * skipping; arcs in row-major order, see {@link orderDagRows}.
407
+ * @param options - n, p and seed
408
+ * @returns the directed acyclic graph
409
+ */
410
+ export function randomOrderDagGraph(options: RandomOrderDagOptions): SampleGraph {
411
+ const { n, p } = options;
412
+ checkInt("n", n, 0);
413
+ checkProbability("p", p);
414
+ resolveSeed(options.seed);
415
+ const out = binomialBuffer((n * (n - 1)) / 2, p);
416
+ orderDagRows(options, 0, n, out);
417
+ return applyWeights(toGraph(n, out, true), options);
418
+ }
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Erdos-Renyi random graphs: Gilbert's G(n, p) (every pair independently with probability p) and
3
+ * Erdos-Renyi's G(n, m) (m pairs uniformly without replacement).
4
+ */
5
+
6
+ import { detLog } from "../random/log.js";
7
+ import { RandomStream, resolveSeed } from "../random/stream.js";
8
+ import { type SampleGraph } from "../types.js";
9
+ import { bernoulliSegment, binomialBuffer, checkInt, checkProbability, EdgeBuffer, toGraph } from "./util.js";
10
+ import { applyWeights, type WeightOptions } from "./weights.js";
11
+
12
+ /** Options of {@link erdosRenyiGraph}. */
13
+ export interface ErdosRenyiOptions extends WeightOptions {
14
+ /** The node count, >= 0. */
15
+ n: number;
16
+ /** The probability of each pair, in [0, 1]. */
17
+ p: number;
18
+ /**
19
+ * Directed: every ordered pair (u, v), u != v, is an arc independently with probability p.
20
+ * Default false (unordered pairs).
21
+ */
22
+ directed?: boolean | undefined;
23
+ /** The seed, an integer in [0, 2^53); default 0. */
24
+ seed?: number | undefined;
25
+ }
26
+
27
+ /**
28
+ * Rows [start, end) of G(n, p): row u draws from stream (seed, "gnp", u) and holds the pairs
29
+ * (u, v), v = u + 1 .. n - 1, in ascending v. Concatenating any split of [0, n) into consecutive
30
+ * ranges gives exactly the whole graph's edge list.
31
+ * @param options - the generator's options (already checked)
32
+ * @param start - the first row
33
+ * @param end - one past the last row
34
+ * @param out - receives the edges
35
+ */
36
+ export function erdosRenyiRows(options: ErdosRenyiOptions, start: number, end: number, out: EdgeBuffer): void {
37
+ const { n, p } = options;
38
+ const logQ = detLog(1 - p);
39
+ if (options.directed === true) {
40
+ directedRows(n, p, logQ, resolveSeed(options.seed), start, end, out);
41
+ return;
42
+ }
43
+ const stream = new RandomStream(resolveSeed(options.seed), "gnp", 0);
44
+ for (let u = start; u < end; u++) {
45
+ stream.reset(u);
46
+ bernoulliSegment(stream, p, logQ, u, u + 1, n, out);
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Rows [start, end) of the directed G(n, p): row u draws from stream (seed, "gnp-directed", u)
52
+ * and skips over its n - 1 candidates, candidate j being the node j < u ? j : j + 1, so the arcs
53
+ * (u, v) come in ascending v.
54
+ * @param n - the node count
55
+ * @param p - the probability
56
+ * @param logQ - detLog(1 - p)
57
+ * @param seed - the resolved seed
58
+ * @param start - the first row
59
+ * @param end - one past the last row
60
+ * @param out - receives the arcs
61
+ */
62
+ function directedRows(n: number, p: number, logQ: number, seed: number, start: number, end: number, out: EdgeBuffer): void {
63
+ if (p === 0) {
64
+ return;
65
+ }
66
+ const stream = new RandomStream(seed, "gnp-directed", 0);
67
+ for (let u = start; u < end; u++) {
68
+ stream.reset(u);
69
+ let j = p === 1 ? 0 : stream.nextSkip(logQ);
70
+ while (j < n - 1) {
71
+ out.push(u, j < u ? j : j + 1);
72
+ j += p === 1 ? 1 : 1 + stream.nextSkip(logQ);
73
+ }
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Gilbert's G(n, p) in O(n + m) by geometric skipping (Batagelj and Brandes 2005). Edges are the
79
+ * pairs (u, v), u < v, in row-major order; row u draws from its own stream, so the graph does not
80
+ * depend on how the rows are split between workers. With `directed: true`, the arcs (u, v) of
81
+ * every ordered pair u != v, by u then v ascending, each row from stream (seed, "gnp-directed", u).
82
+ * @param options - n, p and seed
83
+ * @returns the undirected graph
84
+ */
85
+ export function erdosRenyiGraph(options: ErdosRenyiOptions): SampleGraph {
86
+ const { n, p } = options;
87
+ checkInt("n", n, 0);
88
+ checkProbability("p", p);
89
+ resolveSeed(options.seed);
90
+ const directed = options.directed === true;
91
+ const pairs = (n * (n - 1)) / (directed ? 1 : 2);
92
+ const out = binomialBuffer(pairs, p);
93
+ erdosRenyiRows(options, 0, n, out);
94
+ return applyWeights(toGraph(n, out, directed), options);
95
+ }
96
+
97
+ /** Options of {@link erdosRenyiGnmGraph}. */
98
+ export interface ErdosRenyiGnmOptions extends WeightOptions {
99
+ /** The node count, >= 0. */
100
+ n: number;
101
+ /** The edge count, in [0, n (n - 1) / 2]. */
102
+ m: number;
103
+ /** The seed, an integer in [0, 2^53); default 0. */
104
+ seed?: number | undefined;
105
+ }
106
+
107
+ /**
108
+ * An open-addressing set of non-negative integers below 2^53, sized for `capacity` entries.
109
+ */
110
+ class NumberSet {
111
+ private readonly slots: Float64Array;
112
+ private readonly mask: number;
113
+
114
+ /**
115
+ * An empty set.
116
+ * @param capacity - the maximum number of entries
117
+ */
118
+ constructor(capacity: number) {
119
+ let size = 16;
120
+ while (size < capacity * 2) {
121
+ size *= 2;
122
+ }
123
+ this.slots = new Float64Array(size).fill(-1);
124
+ this.mask = size - 1;
125
+ }
126
+
127
+ /**
128
+ * Insert `x`.
129
+ * @param x - the value
130
+ * @returns false when it was already present
131
+ */
132
+ add(x: number): boolean {
133
+ let i = Math.imul((x >>> 0) ^ Math.floor(x / 4294967296), 0x9e3779b1) & this.mask;
134
+ for (;;) {
135
+ const slot = this.slots[i];
136
+ if (slot === -1) {
137
+ this.slots[i] = x;
138
+ return true;
139
+ }
140
+ if (slot === x) {
141
+ return false;
142
+ }
143
+ i = (i + 1) & this.mask;
144
+ }
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Erdos-Renyi's G(n, m): m distinct pairs chosen uniformly, by Floyd's sampling over the pair
150
+ * indices 0 .. n (n - 1) / 2 - 1 (exactly m draws from stream (seed, "gnm", 0), no rejection
151
+ * loop), in O(m log m). Edges are the pairs (u, v), u < v, in row-major order.
152
+ * @param options - n, m and seed
153
+ * @returns the undirected graph
154
+ */
155
+ export function erdosRenyiGnmGraph(options: ErdosRenyiGnmOptions): SampleGraph {
156
+ const { n, m } = options;
157
+ const seed = resolveSeed(options.seed);
158
+ // the pair indices must stay below 2^53 to be exact doubles
159
+ checkInt("n", n, 0, 2 ** 27);
160
+ const total = (n * (n - 1)) / 2;
161
+ checkInt("m", m, 0, Math.min(total, 2 ** 32 - 2));
162
+ const stream = new RandomStream(seed, "gnm", 0);
163
+ const chosen = new Float64Array(m);
164
+ const set = new NumberSet(m);
165
+ for (let k = 0, j = total - m; j < total; j++, k++) {
166
+ const t = stream.nextBelow(j + 1);
167
+ if (set.add(t)) {
168
+ chosen[k] = t;
169
+ } else {
170
+ set.add(j);
171
+ chosen[k] = j;
172
+ }
173
+ }
174
+ chosen.sort();
175
+ const out = new EdgeBuffer(m);
176
+ // walk the sorted pair indices row by row: row u holds indices [rowStart, rowStart + n - u - 1)
177
+ let u = 0;
178
+ let rowStart = 0;
179
+ for (let k = 0; k < m; k++) {
180
+ const index = chosen[k];
181
+ while (index >= rowStart + (n - u - 1)) {
182
+ rowStart += n - u - 1;
183
+ u++;
184
+ }
185
+ out.push(u, u + 1 + (index - rowStart));
186
+ }
187
+ return applyWeights(toGraph(n, out, false), options);
188
+ }