@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.
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,154 @@
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
+ import { detLog } from "../random/log.js";
6
+ import { RandomStream, resolveSeed } from "../random/stream.js";
7
+ import { bernoulliSegment, binomialBuffer, checkInt, checkProbability, EdgeBuffer, toGraph } from "./util.js";
8
+ import { applyWeights } from "./weights.js";
9
+ /**
10
+ * Rows [start, end) of G(n, p): row u draws from stream (seed, "gnp", u) and holds the pairs
11
+ * (u, v), v = u + 1 .. n - 1, in ascending v. Concatenating any split of [0, n) into consecutive
12
+ * ranges gives exactly the whole graph's edge list.
13
+ * @param options - the generator's options (already checked)
14
+ * @param start - the first row
15
+ * @param end - one past the last row
16
+ * @param out - receives the edges
17
+ */
18
+ export function erdosRenyiRows(options, start, end, out) {
19
+ const { n, p } = options;
20
+ const logQ = detLog(1 - p);
21
+ if (options.directed === true) {
22
+ directedRows(n, p, logQ, resolveSeed(options.seed), start, end, out);
23
+ return;
24
+ }
25
+ const stream = new RandomStream(resolveSeed(options.seed), "gnp", 0);
26
+ for (let u = start; u < end; u++) {
27
+ stream.reset(u);
28
+ bernoulliSegment(stream, p, logQ, u, u + 1, n, out);
29
+ }
30
+ }
31
+ /**
32
+ * Rows [start, end) of the directed G(n, p): row u draws from stream (seed, "gnp-directed", u)
33
+ * and skips over its n - 1 candidates, candidate j being the node j < u ? j : j + 1, so the arcs
34
+ * (u, v) come in ascending v.
35
+ * @param n - the node count
36
+ * @param p - the probability
37
+ * @param logQ - detLog(1 - p)
38
+ * @param seed - the resolved seed
39
+ * @param start - the first row
40
+ * @param end - one past the last row
41
+ * @param out - receives the arcs
42
+ */
43
+ function directedRows(n, p, logQ, seed, start, end, out) {
44
+ if (p === 0) {
45
+ return;
46
+ }
47
+ const stream = new RandomStream(seed, "gnp-directed", 0);
48
+ for (let u = start; u < end; u++) {
49
+ stream.reset(u);
50
+ let j = p === 1 ? 0 : stream.nextSkip(logQ);
51
+ while (j < n - 1) {
52
+ out.push(u, j < u ? j : j + 1);
53
+ j += p === 1 ? 1 : 1 + stream.nextSkip(logQ);
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Gilbert's G(n, p) in O(n + m) by geometric skipping (Batagelj and Brandes 2005). Edges are the
59
+ * pairs (u, v), u < v, in row-major order; row u draws from its own stream, so the graph does not
60
+ * depend on how the rows are split between workers. With `directed: true`, the arcs (u, v) of
61
+ * every ordered pair u != v, by u then v ascending, each row from stream (seed, "gnp-directed", u).
62
+ * @param options - n, p and seed
63
+ * @returns the undirected graph
64
+ */
65
+ export function erdosRenyiGraph(options) {
66
+ const { n, p } = options;
67
+ checkInt("n", n, 0);
68
+ checkProbability("p", p);
69
+ resolveSeed(options.seed);
70
+ const directed = options.directed === true;
71
+ const pairs = (n * (n - 1)) / (directed ? 1 : 2);
72
+ const out = binomialBuffer(pairs, p);
73
+ erdosRenyiRows(options, 0, n, out);
74
+ return applyWeights(toGraph(n, out, directed), options);
75
+ }
76
+ /**
77
+ * An open-addressing set of non-negative integers below 2^53, sized for `capacity` entries.
78
+ */
79
+ class NumberSet {
80
+ /**
81
+ * An empty set.
82
+ * @param capacity - the maximum number of entries
83
+ */
84
+ constructor(capacity) {
85
+ let size = 16;
86
+ while (size < capacity * 2) {
87
+ size *= 2;
88
+ }
89
+ this.slots = new Float64Array(size).fill(-1);
90
+ this.mask = size - 1;
91
+ }
92
+ /**
93
+ * Insert `x`.
94
+ * @param x - the value
95
+ * @returns false when it was already present
96
+ */
97
+ add(x) {
98
+ let i = Math.imul((x >>> 0) ^ Math.floor(x / 4294967296), 0x9e3779b1) & this.mask;
99
+ for (;;) {
100
+ const slot = this.slots[i];
101
+ if (slot === -1) {
102
+ this.slots[i] = x;
103
+ return true;
104
+ }
105
+ if (slot === x) {
106
+ return false;
107
+ }
108
+ i = (i + 1) & this.mask;
109
+ }
110
+ }
111
+ }
112
+ /**
113
+ * Erdos-Renyi's G(n, m): m distinct pairs chosen uniformly, by Floyd's sampling over the pair
114
+ * indices 0 .. n (n - 1) / 2 - 1 (exactly m draws from stream (seed, "gnm", 0), no rejection
115
+ * loop), in O(m log m). Edges are the pairs (u, v), u < v, in row-major order.
116
+ * @param options - n, m and seed
117
+ * @returns the undirected graph
118
+ */
119
+ export function erdosRenyiGnmGraph(options) {
120
+ const { n, m } = options;
121
+ const seed = resolveSeed(options.seed);
122
+ // the pair indices must stay below 2^53 to be exact doubles
123
+ checkInt("n", n, 0, 2 ** 27);
124
+ const total = (n * (n - 1)) / 2;
125
+ checkInt("m", m, 0, Math.min(total, 2 ** 32 - 2));
126
+ const stream = new RandomStream(seed, "gnm", 0);
127
+ const chosen = new Float64Array(m);
128
+ const set = new NumberSet(m);
129
+ for (let k = 0, j = total - m; j < total; j++, k++) {
130
+ const t = stream.nextBelow(j + 1);
131
+ if (set.add(t)) {
132
+ chosen[k] = t;
133
+ }
134
+ else {
135
+ set.add(j);
136
+ chosen[k] = j;
137
+ }
138
+ }
139
+ chosen.sort();
140
+ const out = new EdgeBuffer(m);
141
+ // walk the sorted pair indices row by row: row u holds indices [rowStart, rowStart + n - u - 1)
142
+ let u = 0;
143
+ let rowStart = 0;
144
+ for (let k = 0; k < m; k++) {
145
+ const index = chosen[k];
146
+ while (index >= rowStart + (n - u - 1)) {
147
+ rowStart += n - u - 1;
148
+ u++;
149
+ }
150
+ out.push(u, u + 1 + (index - rowStart));
151
+ }
152
+ return applyWeights(toGraph(n, out, false), options);
153
+ }
154
+ //# sourceMappingURL=erdos-renyi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erdos-renyi.js","sourceRoot":"","sources":["../../../src/generators/erdos-renyi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Maximum-flow networks: a grid (the image-segmentation shape), a random layered DAG, GENRMF and
3
+ * the AK network. Every one is directed, with integer capacities as its `weights`, a `role` node
4
+ * column and its source and sink.
5
+ */
6
+ import { type SampleGraph } from "../types.js";
7
+ import { EdgeBuffer } from "./util.js";
8
+ /** A maximum-flow instance: a directed graph whose `weights` are integer capacities. */
9
+ export interface FlowNetwork extends SampleGraph {
10
+ /** The source node. */
11
+ readonly source: number;
12
+ /** The sink node. */
13
+ readonly sink: number;
14
+ }
15
+ /** The capacity range options of the random flow networks. */
16
+ interface CapacityOptions {
17
+ /** The smallest arc capacity, an integer >= 0; default 1. */
18
+ minCapacity?: number | undefined;
19
+ /** The largest arc capacity, an integer >= minCapacity; default 10. */
20
+ maxCapacity?: number | undefined;
21
+ /** The seed, an integer in [0, 2^53); default 0. */
22
+ seed?: number | undefined;
23
+ }
24
+ /** Options of {@link gridFlowNetwork}. */
25
+ export interface GridFlowOptions extends CapacityOptions {
26
+ /** The grid's row count, >= 1. */
27
+ rows: number;
28
+ /** The grid's column count, >= 2. */
29
+ cols: number;
30
+ }
31
+ /**
32
+ * A grid flow network, the shape of graph-cut image segmentation: node r * cols + c for pixel
33
+ * (r, c), arcs to each 4-neighbour in both directions, listed by node, in the order right, down,
34
+ * left, up; node u draws its arcs' capacities, uniform integers in [minCapacity, maxCapacity],
35
+ * from stream (seed, "grid-flow", u) in that order. Then the source rows * cols with an arc to
36
+ * every left-column node (by row), and every right-column node with an arc to the sink
37
+ * rows * cols + 1 (by row), each of capacity 4 * maxCapacity. Those terminal arcs are never a
38
+ * minimum cut: the arcs from the first column to the second already cut the network with at most
39
+ * rows * maxCapacity. Node columns `x` = c and `y` = r (Float64), the source at x = -1 and the
40
+ * sink at x = cols, both at the middle row; `role` (u8: 0 inner, 1 source, 2 sink). O(rows cols).
41
+ * @param options - rows, cols, minCapacity, maxCapacity and seed
42
+ * @returns the flow network
43
+ */
44
+ export declare function gridFlowNetwork(options: GridFlowOptions): FlowNetwork;
45
+ /** Options of {@link layeredFlowNetwork}. */
46
+ export interface LayeredFlowOptions extends CapacityOptions {
47
+ /** The width of every inner layer, >= 1 each; layer i holds the next `layers[i]` node indices. */
48
+ layers: readonly number[];
49
+ /** The probability of each arc from a node to a node of the next layer. */
50
+ p: number;
51
+ }
52
+ /** The node layout of a layered flow network. */
53
+ interface LayeredFlowPlan {
54
+ /** starts[i] = the first node of inner layer i; starts[L] = the inner node count. */
55
+ readonly starts: readonly number[];
56
+ /** The inner layer of every inner node. */
57
+ readonly layerOf: Uint32Array;
58
+ /** The arc probability. */
59
+ readonly p: number;
60
+ /** The capacity range. */
61
+ readonly min: number;
62
+ /** The capacity range. */
63
+ readonly max: number;
64
+ /** The capacity of every terminal arc: max * (the widest layer). */
65
+ readonly terminal: number;
66
+ /** The resolved seed. */
67
+ readonly seed: number;
68
+ }
69
+ /**
70
+ * Check a layered flow network's options and lay out its nodes.
71
+ * @param options - the options
72
+ * @returns the plan
73
+ */
74
+ export declare function planLayeredFlow(options: LayeredFlowOptions): LayeredFlowPlan;
75
+ /**
76
+ * Rows [start, end) of the inner arcs of a layered flow network: inner node u of a layer before
77
+ * the last draws from stream (seed, "layered-flow", u) first its arcs to the next layer
78
+ * (ascending, by geometric skipping), then their capacities in the same order.
79
+ * @param plan - the plan
80
+ * @param start - the first inner node
81
+ * @param end - one past the last inner node
82
+ * @param out - receives the arcs
83
+ * @param capacities - receives their capacities
84
+ */
85
+ export declare function layeredFlowRows(plan: LayeredFlowPlan, start: number, end: number, out: EdgeBuffer, capacities: number[]): void;
86
+ /**
87
+ * A random layered flow network: inner layers as in `randomDagGraph` (arcs only from layer i to
88
+ * layer i + 1, each with probability p, capacities uniform integers in [minCapacity,
89
+ * maxCapacity]), a source feeding every node of the first layer and every node of the last layer
90
+ * feeding a sink. Inner nodes come first, layer by layer; the source is node N and the sink
91
+ * N + 1 (N inner nodes). Arcs: the inner arcs by source node (see {@link layeredFlowRows}), then
92
+ * source -> first-layer nodes ascending, then last-layer nodes -> sink ascending; each terminal
93
+ * arc has capacity maxCapacity * (the widest layer), at least what any one node can pass on.
94
+ * Node column `layer` (u32): inner layer i is i + 1, the source is layer 0 and the sink layer
95
+ * L + 1, so the column is a topological layering of the whole network; `role` (u8). O(N + m).
96
+ * @param options - layers, p, minCapacity, maxCapacity and seed
97
+ * @returns the flow network
98
+ */
99
+ export declare function layeredFlowNetwork(options: LayeredFlowOptions): FlowNetwork;
100
+ /** Options of {@link genrmfGraph}. */
101
+ export interface GenrmfOptions {
102
+ /** The side of every frame (an a x a grid), >= 1. */
103
+ a: number;
104
+ /** The number of frames, >= 1. */
105
+ b: number;
106
+ /** The smallest capacity between frames, an integer >= 0. */
107
+ c1: number;
108
+ /** The largest capacity between frames, an integer >= c1; arcs inside a frame carry c2 a^2. */
109
+ c2: number;
110
+ /** The seed, an integer in [0, 2^53); default 0. */
111
+ seed?: number | undefined;
112
+ }
113
+ /**
114
+ * GENRMF, the max-flow family of D. Goldfarb and M. D. Grigoriadis ("A computational comparison
115
+ * of the Dinic and network simplex methods for maximum flow", Annals of Operations Research 13,
116
+ * 81-123, 1988, doi:10.1007/BF02288321) as generated by Tamas Badics's `genrmf` (1991, First
117
+ * DIMACS Implementation Challenge): b frames, each an a x a grid. Node f a^2 + r a + c is (r, c)
118
+ * of frame f. Arcs, frame by frame: the frame's grid arcs to each 4-neighbour in both directions
119
+ * (by node; right, down, left, up) with capacity c2 a^2; then, for f < b - 1, node j of frame f
120
+ * -> node perm_f(j) of frame f + 1 for j ascending, with capacity uniform in [c1, c2]. Stream
121
+ * (seed, "genrmf", f) first draws perm_f, a Fisher-Yates shuffle of 0 .. a^2 - 1 (for i = a^2 - 1
122
+ * down to 1, swap i with nextBelow(i + 1)), then the a^2 capacities in j order. The source is
123
+ * node 0 (the first node of the first frame), the sink the last node of the last frame. Node
124
+ * columns `frame` (u32) and `role` (u8). Badics's own random numbers are not reproduced; the
125
+ * structure is. O(a^2 b).
126
+ * @param options - a, b, c1, c2 and seed
127
+ * @returns the flow network
128
+ */
129
+ export declare function genrmfGraph(options: GenrmfOptions): FlowNetwork;
130
+ /** Options of {@link akGraph}. */
131
+ export interface AkOptions {
132
+ /** The size parameter, in [1, 499998]: 4k + 6 nodes and 6k + 7 arcs. */
133
+ k: number;
134
+ }
135
+ /**
136
+ * The AK network of B. V. Cherkassky and A. V. Goldberg ("On implementing the push-relabel method
137
+ * for the maximum flow problem", Algorithmica 19, 390-410, 1997, doi:10.1007/PL00009180), built to
138
+ * be hard for push-relabel. Deterministic; n = 4k + 6 nodes, m = 6k + 7 arcs.
139
+ *
140
+ * Nodes: s = 0, t = 1; part A a_i = 2 + i (i = 0 .. k); a hub chain h = k + 3 .. e = 2k + 3;
141
+ * part B b_i = 2k + 4 + i (i = 0 .. 2k + 1). Arcs, in this order: for i = 0 .. k - 1, a_i ->
142
+ * a_{i+1} (capacity k + 1 - i) then a_i -> h (1); a_k -> e (1), a_k -> h (1); the chain j -> j + 1
143
+ * for j = h .. e - 1 (k + 1); b_i -> b_{i+1} for i = 0 .. 2k (k); the folds b_i -> b_{2k+1-i}
144
+ * (1) for i = 0 .. k - 1; finally s -> a_0, s -> b_0, e -> t and b_{2k+1} -> t, each 1000000.
145
+ * The maximum flow is 2k + 3 and the largest inner capacity k + 1, so k is capped at 499998 to
146
+ * keep the terminal capacity 1000000 from ever binding (every value is then exact in Float32).
147
+ * Node column `role` (u8). O(k).
148
+ * @param options - k
149
+ * @returns the flow network
150
+ */
151
+ export declare function akGraph(options: AkOptions): FlowNetwork;
152
+ export {};
153
+ //# sourceMappingURL=flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/generators/flow.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAgE,UAAU,EAAE,MAAM,WAAW,CAAC;AAErG,wFAAwF;AACxF,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC5C,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAOD,8DAA8D;AAC9D,UAAU,eAAe;IACrB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AA+ED,0CAA0C;AAC1C,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACpD,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,WAAW,CA0CrE;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACvD,kGAAkG;IAClG,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,2EAA2E;IAC3E,CAAC,EAAE,MAAM,CAAC;CACb;AAED,iDAAiD;AACjD,UAAU,eAAe;IACrB,qFAAqF;IACrF,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,2BAA2B;IAC3B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,eAAe,CAmB5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,EAAE,GACrB,IAAI,CAgBN;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAyB3E;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC1B,qDAAqD;IACrD,CAAC,EAAE,MAAM,CAAC;IACV,kCAAkC;IAClC,CAAC,EAAE,MAAM,CAAC;IACV,6DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,+FAA+F;IAC/F,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,WAAW,CAkD/D;AAED,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACtB,wEAAwE;IACxE,CAAC,EAAE,MAAM,CAAC;CACb;AAKD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,GAAG,WAAW,CAiCvD"}
@@ -0,0 +1,346 @@
1
+ /**
2
+ * Maximum-flow networks: a grid (the image-segmentation shape), a random layered DAG, GENRMF and
3
+ * the AK network. Every one is directed, with integer capacities as its `weights`, a `role` node
4
+ * column and its source and sink.
5
+ */
6
+ import { detLog } from "../random/log.js";
7
+ import { RandomStream, resolveSeed } from "../random/stream.js";
8
+ import { bernoulliSegment, checkEdgeCount, checkInt, checkProbability, EdgeBuffer } from "./util.js";
9
+ /**
10
+ * The largest capacity: 2^24, the last point where every integer is exact in a Float32 weight.
11
+ */
12
+ const MAX_CAPACITY = 2 ** 24;
13
+ /**
14
+ * The checked capacity range.
15
+ * @param options - the options
16
+ * @param terminalFactor - the terminal arcs carry terminalFactor * maxCapacity, which must stay exact
17
+ * @returns min and max
18
+ */
19
+ function capacityRange(options, terminalFactor) {
20
+ const min = options.minCapacity ?? 1;
21
+ const max = options.maxCapacity ?? 10;
22
+ checkInt("minCapacity", min, 0, MAX_CAPACITY);
23
+ checkInt("maxCapacity", max, min, Math.floor(MAX_CAPACITY / terminalFactor));
24
+ return { min, max };
25
+ }
26
+ /**
27
+ * Assemble a flow network.
28
+ * @param n - the node count
29
+ * @param out - the arcs
30
+ * @param capacities - one capacity per arc
31
+ * @param source - the source
32
+ * @param sink - the sink
33
+ * @param columns - node columns besides `role`
34
+ * @returns the network
35
+ */
36
+ function toNetwork(n, out, capacities, source, sink, columns) {
37
+ const { src, dst } = out.finish();
38
+ const role = new Uint8Array(n);
39
+ role[source] = 1;
40
+ role[sink] = 2;
41
+ return {
42
+ directed: true,
43
+ nodeCount: n,
44
+ src,
45
+ dst,
46
+ weights: Float32Array.from(capacities),
47
+ nodeColumns: { ...columns, role },
48
+ source,
49
+ sink,
50
+ };
51
+ }
52
+ /**
53
+ * Push the arcs of node (r, c) of a rows x cols grid starting at `base` to its 4-neighbours, in
54
+ * the order right, down, left, up.
55
+ * @param out - the buffer
56
+ * @param base - the grid's first node
57
+ * @param rows - the row count
58
+ * @param cols - the column count
59
+ * @param r - the row
60
+ * @param c - the column
61
+ * @returns how many arcs were pushed
62
+ */
63
+ function gridArcs(out, base, rows, cols, r, c) {
64
+ const u = base + r * cols + c;
65
+ const before = out.length;
66
+ if (c + 1 < cols) {
67
+ out.push(u, u + 1);
68
+ }
69
+ if (r + 1 < rows) {
70
+ out.push(u, u + cols);
71
+ }
72
+ if (c > 0) {
73
+ out.push(u, u - 1);
74
+ }
75
+ if (r > 0) {
76
+ out.push(u, u - cols);
77
+ }
78
+ return out.length - before;
79
+ }
80
+ /**
81
+ * A grid flow network, the shape of graph-cut image segmentation: node r * cols + c for pixel
82
+ * (r, c), arcs to each 4-neighbour in both directions, listed by node, in the order right, down,
83
+ * left, up; node u draws its arcs' capacities, uniform integers in [minCapacity, maxCapacity],
84
+ * from stream (seed, "grid-flow", u) in that order. Then the source rows * cols with an arc to
85
+ * every left-column node (by row), and every right-column node with an arc to the sink
86
+ * rows * cols + 1 (by row), each of capacity 4 * maxCapacity. Those terminal arcs are never a
87
+ * minimum cut: the arcs from the first column to the second already cut the network with at most
88
+ * rows * maxCapacity. Node columns `x` = c and `y` = r (Float64), the source at x = -1 and the
89
+ * sink at x = cols, both at the middle row; `role` (u8: 0 inner, 1 source, 2 sink). O(rows cols).
90
+ * @param options - rows, cols, minCapacity, maxCapacity and seed
91
+ * @returns the flow network
92
+ */
93
+ export function gridFlowNetwork(options) {
94
+ const { rows, cols } = options;
95
+ checkInt("rows", rows, 1);
96
+ checkInt("cols", cols, 2);
97
+ const cells = rows * cols;
98
+ checkInt("rows * cols + 2 (the node count)", cells + 2, 0);
99
+ const { min, max } = capacityRange(options, 4);
100
+ const seed = resolveSeed(options.seed);
101
+ const arcs = 2 * (rows * (cols - 1) + cols * (rows - 1)) + 2 * rows;
102
+ checkEdgeCount(arcs);
103
+ const out = new EdgeBuffer(arcs);
104
+ const capacities = [];
105
+ const stream = new RandomStream(seed, "grid-flow", 0);
106
+ const x = new Float64Array(cells + 2);
107
+ const y = new Float64Array(cells + 2);
108
+ for (let r = 0; r < rows; r++) {
109
+ for (let c = 0; c < cols; c++) {
110
+ const u = r * cols + c;
111
+ x[u] = c;
112
+ y[u] = r;
113
+ stream.reset(u);
114
+ const count = gridArcs(out, 0, rows, cols, r, c);
115
+ for (let i = 0; i < count; i++) {
116
+ capacities.push(min + stream.nextBelow(max - min + 1));
117
+ }
118
+ }
119
+ }
120
+ const source = cells;
121
+ const sink = cells + 1;
122
+ x[source] = -1;
123
+ x[sink] = cols;
124
+ y[source] = (rows - 1) / 2;
125
+ y[sink] = (rows - 1) / 2;
126
+ for (let r = 0; r < rows; r++) {
127
+ out.push(source, r * cols);
128
+ capacities.push(4 * max);
129
+ }
130
+ for (let r = 0; r < rows; r++) {
131
+ out.push(r * cols + cols - 1, sink);
132
+ capacities.push(4 * max);
133
+ }
134
+ return toNetwork(cells + 2, out, capacities, source, sink, { x, y });
135
+ }
136
+ /**
137
+ * Check a layered flow network's options and lay out its nodes.
138
+ * @param options - the options
139
+ * @returns the plan
140
+ */
141
+ export function planLayeredFlow(options) {
142
+ const { layers, p } = options;
143
+ checkInt("layers.length", layers.length, 1);
144
+ checkProbability("p", p);
145
+ const starts = [0];
146
+ let widest = 0;
147
+ for (let i = 0; i < layers.length; i++) {
148
+ checkInt(`layers[${i}]`, layers[i], 1);
149
+ starts.push(starts[i] + layers[i]);
150
+ widest = Math.max(widest, layers[i]);
151
+ }
152
+ const inner = starts[layers.length];
153
+ checkInt("the total size + 2 (the node count)", inner + 2, 0);
154
+ const { min, max } = capacityRange(options, widest);
155
+ const layerOf = new Uint32Array(inner);
156
+ for (let i = 0; i < layers.length; i++) {
157
+ layerOf.fill(i, starts[i], starts[i + 1]);
158
+ }
159
+ return { starts, layerOf, p, min, max, terminal: max * widest, seed: resolveSeed(options.seed) };
160
+ }
161
+ /**
162
+ * Rows [start, end) of the inner arcs of a layered flow network: inner node u of a layer before
163
+ * the last draws from stream (seed, "layered-flow", u) first its arcs to the next layer
164
+ * (ascending, by geometric skipping), then their capacities in the same order.
165
+ * @param plan - the plan
166
+ * @param start - the first inner node
167
+ * @param end - one past the last inner node
168
+ * @param out - receives the arcs
169
+ * @param capacities - receives their capacities
170
+ */
171
+ export function layeredFlowRows(plan, start, end, out, capacities) {
172
+ const { starts, layerOf, p, min, max } = plan;
173
+ const logQ = detLog(1 - p);
174
+ const stream = new RandomStream(plan.seed, "layered-flow", 0);
175
+ const last = starts.length - 2;
176
+ for (let u = start; u < end; u++) {
177
+ const layer = layerOf[u];
178
+ if (layer < last) {
179
+ stream.reset(u);
180
+ const before = out.length;
181
+ bernoulliSegment(stream, p, logQ, u, starts[layer + 1], starts[layer + 2], out);
182
+ for (let i = before; i < out.length; i++) {
183
+ capacities.push(min + stream.nextBelow(max - min + 1));
184
+ }
185
+ }
186
+ }
187
+ }
188
+ /**
189
+ * A random layered flow network: inner layers as in `randomDagGraph` (arcs only from layer i to
190
+ * layer i + 1, each with probability p, capacities uniform integers in [minCapacity,
191
+ * maxCapacity]), a source feeding every node of the first layer and every node of the last layer
192
+ * feeding a sink. Inner nodes come first, layer by layer; the source is node N and the sink
193
+ * N + 1 (N inner nodes). Arcs: the inner arcs by source node (see {@link layeredFlowRows}), then
194
+ * source -> first-layer nodes ascending, then last-layer nodes -> sink ascending; each terminal
195
+ * arc has capacity maxCapacity * (the widest layer), at least what any one node can pass on.
196
+ * Node column `layer` (u32): inner layer i is i + 1, the source is layer 0 and the sink layer
197
+ * L + 1, so the column is a topological layering of the whole network; `role` (u8). O(N + m).
198
+ * @param options - layers, p, minCapacity, maxCapacity and seed
199
+ * @returns the flow network
200
+ */
201
+ export function layeredFlowNetwork(options) {
202
+ const plan = planLayeredFlow(options);
203
+ const { starts } = plan;
204
+ const L = starts.length - 1;
205
+ const inner = starts[L];
206
+ const out = new EdgeBuffer(inner);
207
+ const capacities = [];
208
+ layeredFlowRows(plan, 0, inner, out, capacities);
209
+ const source = inner;
210
+ const sink = inner + 1;
211
+ const { terminal } = plan;
212
+ for (let u = starts[0]; u < starts[1]; u++) {
213
+ out.push(source, u);
214
+ capacities.push(terminal);
215
+ }
216
+ for (let u = starts[L - 1]; u < starts[L]; u++) {
217
+ out.push(u, sink);
218
+ capacities.push(terminal);
219
+ }
220
+ const layer = new Uint32Array(inner + 2);
221
+ for (let u = 0; u < inner; u++) {
222
+ layer[u] = plan.layerOf[u] + 1;
223
+ }
224
+ layer[sink] = L + 1;
225
+ return toNetwork(inner + 2, out, capacities, source, sink, { layer });
226
+ }
227
+ /**
228
+ * GENRMF, the max-flow family of D. Goldfarb and M. D. Grigoriadis ("A computational comparison
229
+ * of the Dinic and network simplex methods for maximum flow", Annals of Operations Research 13,
230
+ * 81-123, 1988, doi:10.1007/BF02288321) as generated by Tamas Badics's `genrmf` (1991, First
231
+ * DIMACS Implementation Challenge): b frames, each an a x a grid. Node f a^2 + r a + c is (r, c)
232
+ * of frame f. Arcs, frame by frame: the frame's grid arcs to each 4-neighbour in both directions
233
+ * (by node; right, down, left, up) with capacity c2 a^2; then, for f < b - 1, node j of frame f
234
+ * -> node perm_f(j) of frame f + 1 for j ascending, with capacity uniform in [c1, c2]. Stream
235
+ * (seed, "genrmf", f) first draws perm_f, a Fisher-Yates shuffle of 0 .. a^2 - 1 (for i = a^2 - 1
236
+ * down to 1, swap i with nextBelow(i + 1)), then the a^2 capacities in j order. The source is
237
+ * node 0 (the first node of the first frame), the sink the last node of the last frame. Node
238
+ * columns `frame` (u32) and `role` (u8). Badics's own random numbers are not reproduced; the
239
+ * structure is. O(a^2 b).
240
+ * @param options - a, b, c1, c2 and seed
241
+ * @returns the flow network
242
+ */
243
+ export function genrmfGraph(options) {
244
+ const { a, b, c1, c2 } = options;
245
+ checkInt("a", a, 1);
246
+ checkInt("b", b, 1);
247
+ const side = a * a;
248
+ checkInt("a * a * b (the node count)", side * b, 2);
249
+ checkInt("c1", c1, 0, MAX_CAPACITY);
250
+ checkInt("c2", c2, c1, MAX_CAPACITY);
251
+ if (c2 * side > MAX_CAPACITY) {
252
+ throw new RangeError(`c2 * a * a must be at most 2^24 to stay exact, got ${c2 * side}`);
253
+ }
254
+ const seed = resolveSeed(options.seed);
255
+ const n = side * b;
256
+ const arcs = b * 4 * a * (a - 1) + (b - 1) * side;
257
+ checkEdgeCount(arcs);
258
+ const out = new EdgeBuffer(arcs);
259
+ const capacities = [];
260
+ const frame = new Uint32Array(n);
261
+ const perm = new Uint32Array(side);
262
+ const stream = new RandomStream(seed, "genrmf", 0);
263
+ for (let f = 0; f < b; f++) {
264
+ const base = f * side;
265
+ frame.fill(f, base, base + side);
266
+ for (let r = 0; r < a; r++) {
267
+ for (let c = 0; c < a; c++) {
268
+ const count = gridArcs(out, base, a, a, r, c);
269
+ for (let i = 0; i < count; i++) {
270
+ capacities.push(c2 * side);
271
+ }
272
+ }
273
+ }
274
+ if (f === b - 1) {
275
+ break;
276
+ }
277
+ stream.reset(f);
278
+ for (let i = 0; i < side; i++) {
279
+ perm[i] = i;
280
+ }
281
+ for (let i = side - 1; i > 0; i--) {
282
+ const j = stream.nextBelow(i + 1);
283
+ const t = perm[i];
284
+ perm[i] = perm[j];
285
+ perm[j] = t;
286
+ }
287
+ for (let j = 0; j < side; j++) {
288
+ out.push(base + j, base + side + perm[j]);
289
+ capacities.push(c1 + stream.nextBelow(c2 - c1 + 1));
290
+ }
291
+ }
292
+ return toNetwork(n, out, capacities, 0, n - 1, { frame });
293
+ }
294
+ /** The capacity of the AK network's terminal arcs, as in igraph's ak-4102.max instance. */
295
+ const AK_BIG = 1000000;
296
+ /**
297
+ * The AK network of B. V. Cherkassky and A. V. Goldberg ("On implementing the push-relabel method
298
+ * for the maximum flow problem", Algorithmica 19, 390-410, 1997, doi:10.1007/PL00009180), built to
299
+ * be hard for push-relabel. Deterministic; n = 4k + 6 nodes, m = 6k + 7 arcs.
300
+ *
301
+ * Nodes: s = 0, t = 1; part A a_i = 2 + i (i = 0 .. k); a hub chain h = k + 3 .. e = 2k + 3;
302
+ * part B b_i = 2k + 4 + i (i = 0 .. 2k + 1). Arcs, in this order: for i = 0 .. k - 1, a_i ->
303
+ * a_{i+1} (capacity k + 1 - i) then a_i -> h (1); a_k -> e (1), a_k -> h (1); the chain j -> j + 1
304
+ * for j = h .. e - 1 (k + 1); b_i -> b_{i+1} for i = 0 .. 2k (k); the folds b_i -> b_{2k+1-i}
305
+ * (1) for i = 0 .. k - 1; finally s -> a_0, s -> b_0, e -> t and b_{2k+1} -> t, each 1000000.
306
+ * The maximum flow is 2k + 3 and the largest inner capacity k + 1, so k is capped at 499998 to
307
+ * keep the terminal capacity 1000000 from ever binding (every value is then exact in Float32).
308
+ * Node column `role` (u8). O(k).
309
+ * @param options - k
310
+ * @returns the flow network
311
+ */
312
+ export function akGraph(options) {
313
+ const { k } = options;
314
+ checkInt("k", k, 1, 499998);
315
+ const n = 4 * k + 6;
316
+ const out = new EdgeBuffer(6 * k + 7);
317
+ const capacities = [];
318
+ const arc = (u, v, capacity) => {
319
+ out.push(u, v);
320
+ capacities.push(capacity);
321
+ };
322
+ const hub = k + 3;
323
+ const chainEnd = 2 * k + 3;
324
+ const b0 = 2 * k + 4;
325
+ for (let i = 0; i < k; i++) {
326
+ arc(2 + i, 3 + i, k + 1 - i);
327
+ arc(2 + i, hub, 1);
328
+ }
329
+ arc(2 + k, chainEnd, 1);
330
+ arc(2 + k, hub, 1);
331
+ for (let j = hub; j < chainEnd; j++) {
332
+ arc(j, j + 1, k + 1);
333
+ }
334
+ for (let i = 0; i <= 2 * k; i++) {
335
+ arc(b0 + i, b0 + i + 1, k);
336
+ }
337
+ for (let i = 0; i < k; i++) {
338
+ arc(b0 + i, b0 + 2 * k + 1 - i, 1);
339
+ }
340
+ arc(0, 2, AK_BIG);
341
+ arc(0, b0, AK_BIG);
342
+ arc(chainEnd, 1, AK_BIG);
343
+ arc(b0 + 2 * k + 1, 1, AK_BIG);
344
+ return toNetwork(n, out, capacities, 0, 1, {});
345
+ }
346
+ //# sourceMappingURL=flow.js.map