@ladybugmem/icebug 0.1.0

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 (624) hide show
  1. package/README.md +14 -0
  2. package/binding.gyp +54 -0
  3. package/build/Release/.deps/Release/icebug.node.d +1 -0
  4. package/build/Release/.deps/Release/obj.target/icebug/src/addon.o.d +291 -0
  5. package/build/Release/icebug.node +0 -0
  6. package/build/Release/obj.target/icebug/src/addon.o +0 -0
  7. package/lib/index.d.ts +361 -0
  8. package/lib/index.js +102 -0
  9. package/package.json +42 -0
  10. package/src/addon.cpp +1253 -0
  11. package/vendor/include/networkit/GlobalState.hpp +86 -0
  12. package/vendor/include/networkit/Globals.hpp +41 -0
  13. package/vendor/include/networkit/algebraic/AlgebraicGlobals.hpp +27 -0
  14. package/vendor/include/networkit/algebraic/CSRGeneralMatrix.hpp +1292 -0
  15. package/vendor/include/networkit/algebraic/CSRMatrix.hpp +11 -0
  16. package/vendor/include/networkit/algebraic/DenseMatrix.hpp +537 -0
  17. package/vendor/include/networkit/algebraic/DynamicMatrix.hpp +514 -0
  18. package/vendor/include/networkit/algebraic/GraphBLAS.hpp +323 -0
  19. package/vendor/include/networkit/algebraic/MatrixTools.hpp +156 -0
  20. package/vendor/include/networkit/algebraic/Semirings.hpp +171 -0
  21. package/vendor/include/networkit/algebraic/SparseAccumulator.hpp +111 -0
  22. package/vendor/include/networkit/algebraic/Vector.hpp +371 -0
  23. package/vendor/include/networkit/algebraic/algorithms/AlgebraicBFS.hpp +72 -0
  24. package/vendor/include/networkit/algebraic/algorithms/AlgebraicBellmanFord.hpp +88 -0
  25. package/vendor/include/networkit/algebraic/algorithms/AlgebraicMatchingCoarsening.hpp +96 -0
  26. package/vendor/include/networkit/algebraic/algorithms/AlgebraicPageRank.hpp +145 -0
  27. package/vendor/include/networkit/algebraic/algorithms/AlgebraicSpanningEdgeCentrality.hpp +122 -0
  28. package/vendor/include/networkit/algebraic/algorithms/AlgebraicTriangleCounting.hpp +76 -0
  29. package/vendor/include/networkit/auxiliary/AlignedAllocator.hpp +113 -0
  30. package/vendor/include/networkit/auxiliary/ArrayTools.hpp +85 -0
  31. package/vendor/include/networkit/auxiliary/BloomFilter.hpp +70 -0
  32. package/vendor/include/networkit/auxiliary/BucketPQ.hpp +142 -0
  33. package/vendor/include/networkit/auxiliary/Enforce.hpp +117 -0
  34. package/vendor/include/networkit/auxiliary/FunctionTraits.hpp +74 -0
  35. package/vendor/include/networkit/auxiliary/HashUtils.hpp +28 -0
  36. package/vendor/include/networkit/auxiliary/IncrementalUniformRandomSelector.hpp +52 -0
  37. package/vendor/include/networkit/auxiliary/Log.hpp +119 -0
  38. package/vendor/include/networkit/auxiliary/MissingMath.hpp +48 -0
  39. package/vendor/include/networkit/auxiliary/Multiprecision.hpp +17 -0
  40. package/vendor/include/networkit/auxiliary/NumberParsing.hpp +307 -0
  41. package/vendor/include/networkit/auxiliary/NumericTools.hpp +57 -0
  42. package/vendor/include/networkit/auxiliary/Parallel.hpp +56 -0
  43. package/vendor/include/networkit/auxiliary/Parallelism.hpp +33 -0
  44. package/vendor/include/networkit/auxiliary/PrioQueue.hpp +252 -0
  45. package/vendor/include/networkit/auxiliary/Random.hpp +122 -0
  46. package/vendor/include/networkit/auxiliary/SetIntersector.hpp +72 -0
  47. package/vendor/include/networkit/auxiliary/SignalHandling.hpp +39 -0
  48. package/vendor/include/networkit/auxiliary/SortedList.hpp +128 -0
  49. package/vendor/include/networkit/auxiliary/SparseVector.hpp +215 -0
  50. package/vendor/include/networkit/auxiliary/SpinLock.hpp +23 -0
  51. package/vendor/include/networkit/auxiliary/StringBuilder.hpp +322 -0
  52. package/vendor/include/networkit/auxiliary/StringTools.hpp +76 -0
  53. package/vendor/include/networkit/auxiliary/TemplateUtils.hpp +76 -0
  54. package/vendor/include/networkit/auxiliary/Timer.hpp +145 -0
  55. package/vendor/include/networkit/auxiliary/VectorComparator.hpp +32 -0
  56. package/vendor/include/networkit/base/Algorithm.hpp +41 -0
  57. package/vendor/include/networkit/base/DynAlgorithm.hpp +31 -0
  58. package/vendor/include/networkit/centrality/ApproxBetweenness.hpp +62 -0
  59. package/vendor/include/networkit/centrality/ApproxCloseness.hpp +136 -0
  60. package/vendor/include/networkit/centrality/ApproxElectricalCloseness.hpp +156 -0
  61. package/vendor/include/networkit/centrality/ApproxGroupBetweenness.hpp +124 -0
  62. package/vendor/include/networkit/centrality/ApproxSpanningEdge.hpp +84 -0
  63. package/vendor/include/networkit/centrality/Betweenness.hpp +47 -0
  64. package/vendor/include/networkit/centrality/Centrality.hpp +98 -0
  65. package/vendor/include/networkit/centrality/Closeness.hpp +107 -0
  66. package/vendor/include/networkit/centrality/ComplexPaths.hpp +113 -0
  67. package/vendor/include/networkit/centrality/CoreDecomposition.hpp +161 -0
  68. package/vendor/include/networkit/centrality/DegreeCentrality.hpp +55 -0
  69. package/vendor/include/networkit/centrality/DynApproxBetweenness.hpp +95 -0
  70. package/vendor/include/networkit/centrality/DynBetweenness.hpp +99 -0
  71. package/vendor/include/networkit/centrality/DynBetweennessOneNode.hpp +98 -0
  72. package/vendor/include/networkit/centrality/DynKatzCentrality.hpp +115 -0
  73. package/vendor/include/networkit/centrality/DynTopHarmonicCloseness.hpp +223 -0
  74. package/vendor/include/networkit/centrality/EigenvectorCentrality.hpp +41 -0
  75. package/vendor/include/networkit/centrality/EstimateBetweenness.hpp +51 -0
  76. package/vendor/include/networkit/centrality/ForestCentrality.hpp +112 -0
  77. package/vendor/include/networkit/centrality/GedWalk.hpp +225 -0
  78. package/vendor/include/networkit/centrality/GroupCloseness.hpp +115 -0
  79. package/vendor/include/networkit/centrality/GroupClosenessGrowShrink.hpp +78 -0
  80. package/vendor/include/networkit/centrality/GroupClosenessLocalSearch.hpp +77 -0
  81. package/vendor/include/networkit/centrality/GroupClosenessLocalSwaps.hpp +106 -0
  82. package/vendor/include/networkit/centrality/GroupDegree.hpp +155 -0
  83. package/vendor/include/networkit/centrality/GroupHarmonicCloseness.hpp +83 -0
  84. package/vendor/include/networkit/centrality/HarmonicCloseness.hpp +48 -0
  85. package/vendor/include/networkit/centrality/KPathCentrality.hpp +52 -0
  86. package/vendor/include/networkit/centrality/KadabraBetweenness.hpp +242 -0
  87. package/vendor/include/networkit/centrality/KatzCentrality.hpp +62 -0
  88. package/vendor/include/networkit/centrality/LaplacianCentrality.hpp +44 -0
  89. package/vendor/include/networkit/centrality/LocalClusteringCoefficient.hpp +60 -0
  90. package/vendor/include/networkit/centrality/LocalPartitionCoverage.hpp +43 -0
  91. package/vendor/include/networkit/centrality/LocalSquareClusteringCoefficient.hpp +42 -0
  92. package/vendor/include/networkit/centrality/PageRank.hpp +101 -0
  93. package/vendor/include/networkit/centrality/PermanenceCentrality.hpp +48 -0
  94. package/vendor/include/networkit/centrality/Sfigality.hpp +45 -0
  95. package/vendor/include/networkit/centrality/SpanningEdgeCentrality.hpp +86 -0
  96. package/vendor/include/networkit/centrality/TopCloseness.hpp +136 -0
  97. package/vendor/include/networkit/centrality/TopHarmonicCloseness.hpp +151 -0
  98. package/vendor/include/networkit/clique/MaximalCliques.hpp +83 -0
  99. package/vendor/include/networkit/coarsening/ClusteringProjector.hpp +59 -0
  100. package/vendor/include/networkit/coarsening/CoarsenedGraphView.hpp +156 -0
  101. package/vendor/include/networkit/coarsening/GraphCoarsening.hpp +57 -0
  102. package/vendor/include/networkit/coarsening/MatchingCoarsening.hpp +43 -0
  103. package/vendor/include/networkit/coarsening/ParallelPartitionCoarsening.hpp +33 -0
  104. package/vendor/include/networkit/coarsening/ParallelPartitionCoarseningView.hpp +62 -0
  105. package/vendor/include/networkit/community/AdjustedRandMeasure.hpp +31 -0
  106. package/vendor/include/networkit/community/ClusteringGenerator.hpp +75 -0
  107. package/vendor/include/networkit/community/CommunityDetectionAlgorithm.hpp +58 -0
  108. package/vendor/include/networkit/community/Conductance.hpp +32 -0
  109. package/vendor/include/networkit/community/CoverF1Similarity.hpp +53 -0
  110. package/vendor/include/networkit/community/CoverHubDominance.hpp +38 -0
  111. package/vendor/include/networkit/community/Coverage.hpp +25 -0
  112. package/vendor/include/networkit/community/CutClustering.hpp +62 -0
  113. package/vendor/include/networkit/community/DissimilarityMeasure.hpp +31 -0
  114. package/vendor/include/networkit/community/DynamicNMIDistance.hpp +44 -0
  115. package/vendor/include/networkit/community/EdgeCut.hpp +24 -0
  116. package/vendor/include/networkit/community/GraphClusteringTools.hpp +103 -0
  117. package/vendor/include/networkit/community/GraphStructuralRandMeasure.hpp +28 -0
  118. package/vendor/include/networkit/community/HubDominance.hpp +46 -0
  119. package/vendor/include/networkit/community/IntrapartitionDensity.hpp +44 -0
  120. package/vendor/include/networkit/community/IsolatedInterpartitionConductance.hpp +40 -0
  121. package/vendor/include/networkit/community/IsolatedInterpartitionExpansion.hpp +40 -0
  122. package/vendor/include/networkit/community/JaccardMeasure.hpp +25 -0
  123. package/vendor/include/networkit/community/LFM.hpp +49 -0
  124. package/vendor/include/networkit/community/LPDegreeOrdered.hpp +48 -0
  125. package/vendor/include/networkit/community/LocalCommunityEvaluation.hpp +100 -0
  126. package/vendor/include/networkit/community/LocalCoverEvaluation.hpp +31 -0
  127. package/vendor/include/networkit/community/LocalPartitionEvaluation.hpp +31 -0
  128. package/vendor/include/networkit/community/LouvainMapEquation.hpp +135 -0
  129. package/vendor/include/networkit/community/Modularity.hpp +54 -0
  130. package/vendor/include/networkit/community/NMIDistance.hpp +28 -0
  131. package/vendor/include/networkit/community/NodeStructuralRandMeasure.hpp +27 -0
  132. package/vendor/include/networkit/community/OverlappingCommunityDetectionAlgorithm.hpp +51 -0
  133. package/vendor/include/networkit/community/OverlappingNMIDistance.hpp +175 -0
  134. package/vendor/include/networkit/community/PLM.hpp +89 -0
  135. package/vendor/include/networkit/community/PLP.hpp +83 -0
  136. package/vendor/include/networkit/community/ParallelAgglomerativeClusterer.hpp +37 -0
  137. package/vendor/include/networkit/community/ParallelLeiden.hpp +96 -0
  138. package/vendor/include/networkit/community/ParallelLeidenView.hpp +138 -0
  139. package/vendor/include/networkit/community/PartitionFragmentation.hpp +30 -0
  140. package/vendor/include/networkit/community/PartitionHubDominance.hpp +37 -0
  141. package/vendor/include/networkit/community/PartitionIntersection.hpp +25 -0
  142. package/vendor/include/networkit/community/QualityMeasure.hpp +27 -0
  143. package/vendor/include/networkit/community/SampledGraphStructuralRandMeasure.hpp +40 -0
  144. package/vendor/include/networkit/community/SampledNodeStructuralRandMeasure.hpp +40 -0
  145. package/vendor/include/networkit/community/StablePartitionNodes.hpp +48 -0
  146. package/vendor/include/networkit/components/BiconnectedComponents.hpp +116 -0
  147. package/vendor/include/networkit/components/ComponentDecomposition.hpp +72 -0
  148. package/vendor/include/networkit/components/ConnectedComponents.hpp +55 -0
  149. package/vendor/include/networkit/components/DynConnectedComponents.hpp +71 -0
  150. package/vendor/include/networkit/components/DynWeaklyConnectedComponents.hpp +73 -0
  151. package/vendor/include/networkit/components/ParallelConnectedComponents.hpp +44 -0
  152. package/vendor/include/networkit/components/RandomSpanningForest.hpp +36 -0
  153. package/vendor/include/networkit/components/StronglyConnectedComponents.hpp +50 -0
  154. package/vendor/include/networkit/components/WeaklyConnectedComponents.hpp +59 -0
  155. package/vendor/include/networkit/correlation/Assortativity.hpp +64 -0
  156. package/vendor/include/networkit/distance/APSP.hpp +70 -0
  157. package/vendor/include/networkit/distance/AStar.hpp +68 -0
  158. package/vendor/include/networkit/distance/AStarGeneral.hpp +110 -0
  159. package/vendor/include/networkit/distance/AdamicAdarDistance.hpp +52 -0
  160. package/vendor/include/networkit/distance/AffectedNodes.hpp +130 -0
  161. package/vendor/include/networkit/distance/AlgebraicDistance.hpp +63 -0
  162. package/vendor/include/networkit/distance/BFS.hpp +43 -0
  163. package/vendor/include/networkit/distance/BidirectionalBFS.hpp +51 -0
  164. package/vendor/include/networkit/distance/BidirectionalDijkstra.hpp +69 -0
  165. package/vendor/include/networkit/distance/CommuteTimeDistance.hpp +89 -0
  166. package/vendor/include/networkit/distance/Diameter.hpp +97 -0
  167. package/vendor/include/networkit/distance/Dijkstra.hpp +50 -0
  168. package/vendor/include/networkit/distance/DynAPSP.hpp +67 -0
  169. package/vendor/include/networkit/distance/DynBFS.hpp +56 -0
  170. package/vendor/include/networkit/distance/DynDijkstra.hpp +57 -0
  171. package/vendor/include/networkit/distance/DynPrunedLandmarkLabeling.hpp +67 -0
  172. package/vendor/include/networkit/distance/DynSSSP.hpp +87 -0
  173. package/vendor/include/networkit/distance/Eccentricity.hpp +32 -0
  174. package/vendor/include/networkit/distance/EffectiveDiameter.hpp +47 -0
  175. package/vendor/include/networkit/distance/EffectiveDiameterApproximation.hpp +57 -0
  176. package/vendor/include/networkit/distance/FloydWarshall.hpp +93 -0
  177. package/vendor/include/networkit/distance/GraphDistance.hpp +49 -0
  178. package/vendor/include/networkit/distance/HopPlotApproximation.hpp +62 -0
  179. package/vendor/include/networkit/distance/IncompleteDijkstra.hpp +66 -0
  180. package/vendor/include/networkit/distance/IncompleteSSSP.hpp +41 -0
  181. package/vendor/include/networkit/distance/JaccardDistance.hpp +57 -0
  182. package/vendor/include/networkit/distance/MultiTargetBFS.hpp +32 -0
  183. package/vendor/include/networkit/distance/MultiTargetDijkstra.hpp +40 -0
  184. package/vendor/include/networkit/distance/NeighborhoodFunction.hpp +47 -0
  185. package/vendor/include/networkit/distance/NeighborhoodFunctionApproximation.hpp +56 -0
  186. package/vendor/include/networkit/distance/NeighborhoodFunctionHeuristic.hpp +56 -0
  187. package/vendor/include/networkit/distance/NodeDistance.hpp +54 -0
  188. package/vendor/include/networkit/distance/PrunedLandmarkLabeling.hpp +76 -0
  189. package/vendor/include/networkit/distance/ReverseBFS.hpp +46 -0
  190. package/vendor/include/networkit/distance/SPSP.hpp +143 -0
  191. package/vendor/include/networkit/distance/SSSP.hpp +216 -0
  192. package/vendor/include/networkit/distance/STSP.hpp +193 -0
  193. package/vendor/include/networkit/distance/Volume.hpp +66 -0
  194. package/vendor/include/networkit/dynamics/DGSStreamParser.hpp +40 -0
  195. package/vendor/include/networkit/dynamics/DGSWriter.hpp +30 -0
  196. package/vendor/include/networkit/dynamics/GraphDifference.hpp +110 -0
  197. package/vendor/include/networkit/dynamics/GraphEvent.hpp +55 -0
  198. package/vendor/include/networkit/dynamics/GraphEventHandler.hpp +39 -0
  199. package/vendor/include/networkit/dynamics/GraphEventProxy.hpp +55 -0
  200. package/vendor/include/networkit/dynamics/GraphUpdater.hpp +38 -0
  201. package/vendor/include/networkit/edgescores/ChibaNishizekiQuadrangleEdgeScore.hpp +26 -0
  202. package/vendor/include/networkit/edgescores/ChibaNishizekiTriangleEdgeScore.hpp +33 -0
  203. package/vendor/include/networkit/edgescores/EdgeScore.hpp +50 -0
  204. package/vendor/include/networkit/edgescores/EdgeScoreAsWeight.hpp +33 -0
  205. package/vendor/include/networkit/edgescores/EdgeScoreBlender.hpp +33 -0
  206. package/vendor/include/networkit/edgescores/EdgeScoreLinearizer.hpp +32 -0
  207. package/vendor/include/networkit/edgescores/EdgeScoreNormalizer.hpp +35 -0
  208. package/vendor/include/networkit/edgescores/GeometricMeanScore.hpp +29 -0
  209. package/vendor/include/networkit/edgescores/PrefixJaccardScore.hpp +23 -0
  210. package/vendor/include/networkit/edgescores/TriangleEdgeScore.hpp +39 -0
  211. package/vendor/include/networkit/embedding/Node2Vec.hpp +83 -0
  212. package/vendor/include/networkit/flow/EdmondsKarp.hpp +112 -0
  213. package/vendor/include/networkit/generators/BarabasiAlbertGenerator.hpp +87 -0
  214. package/vendor/include/networkit/generators/ChungLuGenerator.hpp +46 -0
  215. package/vendor/include/networkit/generators/ChungLuGeneratorAlamEtAl.hpp +63 -0
  216. package/vendor/include/networkit/generators/ClusteredRandomGraphGenerator.hpp +56 -0
  217. package/vendor/include/networkit/generators/ConfigurationModel.hpp +36 -0
  218. package/vendor/include/networkit/generators/DorogovtsevMendesGenerator.hpp +33 -0
  219. package/vendor/include/networkit/generators/DynamicBarabasiAlbertGenerator.hpp +33 -0
  220. package/vendor/include/networkit/generators/DynamicDGSParser.hpp +51 -0
  221. package/vendor/include/networkit/generators/DynamicDorogovtsevMendesGenerator.hpp +34 -0
  222. package/vendor/include/networkit/generators/DynamicForestFireGenerator.hpp +55 -0
  223. package/vendor/include/networkit/generators/DynamicGraphGenerator.hpp +40 -0
  224. package/vendor/include/networkit/generators/DynamicGraphSource.hpp +79 -0
  225. package/vendor/include/networkit/generators/DynamicHyperbolicGenerator.hpp +143 -0
  226. package/vendor/include/networkit/generators/DynamicPathGenerator.hpp +26 -0
  227. package/vendor/include/networkit/generators/DynamicPubWebGenerator.hpp +54 -0
  228. package/vendor/include/networkit/generators/EdgeSwitchingMarkovChainGenerator.hpp +65 -0
  229. package/vendor/include/networkit/generators/ErdosRenyiEnumerator.hpp +318 -0
  230. package/vendor/include/networkit/generators/ErdosRenyiGenerator.hpp +56 -0
  231. package/vendor/include/networkit/generators/HavelHakimiGenerator.hpp +48 -0
  232. package/vendor/include/networkit/generators/HyperbolicGenerator.hpp +236 -0
  233. package/vendor/include/networkit/generators/LFRGenerator.hpp +175 -0
  234. package/vendor/include/networkit/generators/MocnikGenerator.hpp +147 -0
  235. package/vendor/include/networkit/generators/MocnikGeneratorBasic.hpp +58 -0
  236. package/vendor/include/networkit/generators/PowerlawDegreeSequence.hpp +128 -0
  237. package/vendor/include/networkit/generators/PubWebGenerator.hpp +94 -0
  238. package/vendor/include/networkit/generators/RegularRingLatticeGenerator.hpp +37 -0
  239. package/vendor/include/networkit/generators/RmatGenerator.hpp +67 -0
  240. package/vendor/include/networkit/generators/StaticDegreeSequenceGenerator.hpp +42 -0
  241. package/vendor/include/networkit/generators/StaticGraphGenerator.hpp +30 -0
  242. package/vendor/include/networkit/generators/StochasticBlockmodel.hpp +41 -0
  243. package/vendor/include/networkit/generators/WattsStrogatzGenerator.hpp +43 -0
  244. package/vendor/include/networkit/generators/quadtree/QuadNode.hpp +857 -0
  245. package/vendor/include/networkit/generators/quadtree/QuadNodeCartesianEuclid.hpp +587 -0
  246. package/vendor/include/networkit/generators/quadtree/QuadNodePolarEuclid.hpp +726 -0
  247. package/vendor/include/networkit/generators/quadtree/Quadtree.hpp +232 -0
  248. package/vendor/include/networkit/generators/quadtree/QuadtreeCartesianEuclid.hpp +149 -0
  249. package/vendor/include/networkit/generators/quadtree/QuadtreePolarEuclid.hpp +143 -0
  250. package/vendor/include/networkit/geometric/HyperbolicSpace.hpp +248 -0
  251. package/vendor/include/networkit/geometric/Point2DWithIndex.hpp +145 -0
  252. package/vendor/include/networkit/global/ClusteringCoefficient.hpp +42 -0
  253. package/vendor/include/networkit/global/GlobalClusteringCoefficient.hpp +24 -0
  254. package/vendor/include/networkit/graph/Attributes.hpp +568 -0
  255. package/vendor/include/networkit/graph/BFS.hpp +111 -0
  256. package/vendor/include/networkit/graph/DFS.hpp +71 -0
  257. package/vendor/include/networkit/graph/Dijkstra.hpp +83 -0
  258. package/vendor/include/networkit/graph/EdgeIterators.hpp +171 -0
  259. package/vendor/include/networkit/graph/Graph.hpp +2083 -0
  260. package/vendor/include/networkit/graph/GraphBuilder.hpp +289 -0
  261. package/vendor/include/networkit/graph/GraphR.hpp +133 -0
  262. package/vendor/include/networkit/graph/GraphTools.hpp +589 -0
  263. package/vendor/include/networkit/graph/GraphW.hpp +1236 -0
  264. package/vendor/include/networkit/graph/KruskalMSF.hpp +50 -0
  265. package/vendor/include/networkit/graph/NeighborIterators.hpp +163 -0
  266. package/vendor/include/networkit/graph/NodeIterators.hpp +127 -0
  267. package/vendor/include/networkit/graph/PrimMSF.hpp +66 -0
  268. package/vendor/include/networkit/graph/RandomMaximumSpanningForest.hpp +133 -0
  269. package/vendor/include/networkit/graph/SpanningForest.hpp +41 -0
  270. package/vendor/include/networkit/graph/TopologicalSort.hpp +87 -0
  271. package/vendor/include/networkit/graph/UnionMaximumSpanningForest.hpp +126 -0
  272. package/vendor/include/networkit/graph/test/GraphBuilderBenchmark.hpp +68 -0
  273. package/vendor/include/networkit/independentset/IndependentSetFinder.hpp +44 -0
  274. package/vendor/include/networkit/independentset/Luby.hpp +27 -0
  275. package/vendor/include/networkit/io/BinaryEdgeListPartitionReader.hpp +45 -0
  276. package/vendor/include/networkit/io/BinaryEdgeListPartitionWriter.hpp +47 -0
  277. package/vendor/include/networkit/io/BinaryPartitionReader.hpp +41 -0
  278. package/vendor/include/networkit/io/BinaryPartitionWriter.hpp +44 -0
  279. package/vendor/include/networkit/io/CoverReader.hpp +27 -0
  280. package/vendor/include/networkit/io/CoverWriter.hpp +21 -0
  281. package/vendor/include/networkit/io/DGSReader.hpp +39 -0
  282. package/vendor/include/networkit/io/DibapGraphReader.hpp +43 -0
  283. package/vendor/include/networkit/io/DotGraphWriter.hpp +39 -0
  284. package/vendor/include/networkit/io/DotPartitionWriter.hpp +23 -0
  285. package/vendor/include/networkit/io/DynamicGraphReader.hpp +29 -0
  286. package/vendor/include/networkit/io/EdgeListCoverReader.hpp +35 -0
  287. package/vendor/include/networkit/io/EdgeListPartitionReader.hpp +43 -0
  288. package/vendor/include/networkit/io/EdgeListReader.hpp +61 -0
  289. package/vendor/include/networkit/io/EdgeListWriter.hpp +48 -0
  290. package/vendor/include/networkit/io/GMLGraphReader.hpp +33 -0
  291. package/vendor/include/networkit/io/GMLGraphWriter.hpp +33 -0
  292. package/vendor/include/networkit/io/GraphIO.hpp +52 -0
  293. package/vendor/include/networkit/io/GraphReader.hpp +40 -0
  294. package/vendor/include/networkit/io/GraphToolBinaryReader.hpp +71 -0
  295. package/vendor/include/networkit/io/GraphToolBinaryWriter.hpp +61 -0
  296. package/vendor/include/networkit/io/GraphWriter.hpp +27 -0
  297. package/vendor/include/networkit/io/KONECTGraphReader.hpp +44 -0
  298. package/vendor/include/networkit/io/LineFileReader.hpp +42 -0
  299. package/vendor/include/networkit/io/METISGraphReader.hpp +36 -0
  300. package/vendor/include/networkit/io/METISGraphWriter.hpp +29 -0
  301. package/vendor/include/networkit/io/METISParser.hpp +63 -0
  302. package/vendor/include/networkit/io/MTXGraphReader.hpp +31 -0
  303. package/vendor/include/networkit/io/MTXParser.hpp +87 -0
  304. package/vendor/include/networkit/io/MatrixMarketReader.hpp +33 -0
  305. package/vendor/include/networkit/io/MatrixReader.hpp +33 -0
  306. package/vendor/include/networkit/io/MemoryMappedFile.hpp +80 -0
  307. package/vendor/include/networkit/io/NetworkitBinaryGraph.hpp +144 -0
  308. package/vendor/include/networkit/io/NetworkitBinaryReader.hpp +50 -0
  309. package/vendor/include/networkit/io/NetworkitBinaryWriter.hpp +71 -0
  310. package/vendor/include/networkit/io/PartitionReader.hpp +34 -0
  311. package/vendor/include/networkit/io/PartitionWriter.hpp +31 -0
  312. package/vendor/include/networkit/io/RBGraphReader.hpp +37 -0
  313. package/vendor/include/networkit/io/RBMatrixReader.hpp +49 -0
  314. package/vendor/include/networkit/io/RasterReader.hpp +40 -0
  315. package/vendor/include/networkit/io/SNAPEdgeListPartitionReader.hpp +28 -0
  316. package/vendor/include/networkit/io/SNAPGraphReader.hpp +53 -0
  317. package/vendor/include/networkit/io/SNAPGraphWriter.hpp +53 -0
  318. package/vendor/include/networkit/io/ThrillGraphBinaryReader.hpp +44 -0
  319. package/vendor/include/networkit/io/ThrillGraphBinaryWriter.hpp +27 -0
  320. package/vendor/include/networkit/layout/LayoutAlgorithm.hpp +39 -0
  321. package/vendor/include/networkit/linkprediction/AdamicAdarIndex.hpp +37 -0
  322. package/vendor/include/networkit/linkprediction/AdjustedRandIndex.hpp +36 -0
  323. package/vendor/include/networkit/linkprediction/AlgebraicDistanceIndex.hpp +70 -0
  324. package/vendor/include/networkit/linkprediction/CommonNeighborsIndex.hpp +39 -0
  325. package/vendor/include/networkit/linkprediction/EvaluationMetric.hpp +135 -0
  326. package/vendor/include/networkit/linkprediction/JaccardIndex.hpp +44 -0
  327. package/vendor/include/networkit/linkprediction/KatzIndex.hpp +84 -0
  328. package/vendor/include/networkit/linkprediction/LinkPredictor.hpp +98 -0
  329. package/vendor/include/networkit/linkprediction/LinkThresholder.hpp +56 -0
  330. package/vendor/include/networkit/linkprediction/MissingLinksFinder.hpp +60 -0
  331. package/vendor/include/networkit/linkprediction/NeighborhoodDistanceIndex.hpp +42 -0
  332. package/vendor/include/networkit/linkprediction/NeighborhoodUtility.hpp +54 -0
  333. package/vendor/include/networkit/linkprediction/NeighborsMeasureIndex.hpp +48 -0
  334. package/vendor/include/networkit/linkprediction/PrecisionRecallMetric.hpp +40 -0
  335. package/vendor/include/networkit/linkprediction/PredictionsSorter.hpp +66 -0
  336. package/vendor/include/networkit/linkprediction/PreferentialAttachmentIndex.hpp +37 -0
  337. package/vendor/include/networkit/linkprediction/ROCMetric.hpp +39 -0
  338. package/vendor/include/networkit/linkprediction/RandomLinkSampler.hpp +47 -0
  339. package/vendor/include/networkit/linkprediction/ResourceAllocationIndex.hpp +38 -0
  340. package/vendor/include/networkit/linkprediction/SameCommunityIndex.hpp +50 -0
  341. package/vendor/include/networkit/linkprediction/TotalNeighborsIndex.hpp +39 -0
  342. package/vendor/include/networkit/linkprediction/UDegreeIndex.hpp +35 -0
  343. package/vendor/include/networkit/linkprediction/VDegreeIndex.hpp +35 -0
  344. package/vendor/include/networkit/matching/BMatcher.hpp +52 -0
  345. package/vendor/include/networkit/matching/BMatching.hpp +115 -0
  346. package/vendor/include/networkit/matching/BSuitorMatcher.hpp +170 -0
  347. package/vendor/include/networkit/matching/DynamicBSuitorMatcher.hpp +78 -0
  348. package/vendor/include/networkit/matching/LocalMaxMatcher.hpp +35 -0
  349. package/vendor/include/networkit/matching/Matcher.hpp +55 -0
  350. package/vendor/include/networkit/matching/Matching.hpp +111 -0
  351. package/vendor/include/networkit/matching/PathGrowingMatcher.hpp +46 -0
  352. package/vendor/include/networkit/matching/SuitorMatcher.hpp +62 -0
  353. package/vendor/include/networkit/numerics/ConjugateGradient.hpp +163 -0
  354. package/vendor/include/networkit/numerics/GaussSeidelRelaxation.hpp +99 -0
  355. package/vendor/include/networkit/numerics/LAMG/LAMGSettings.hpp +70 -0
  356. package/vendor/include/networkit/numerics/LAMG/Lamg.hpp +460 -0
  357. package/vendor/include/networkit/numerics/LAMG/Level/EliminationStage.hpp +47 -0
  358. package/vendor/include/networkit/numerics/LAMG/Level/Level.hpp +56 -0
  359. package/vendor/include/networkit/numerics/LAMG/Level/LevelAggregation.hpp +52 -0
  360. package/vendor/include/networkit/numerics/LAMG/Level/LevelElimination.hpp +133 -0
  361. package/vendor/include/networkit/numerics/LAMG/Level/LevelFinest.hpp +28 -0
  362. package/vendor/include/networkit/numerics/LAMG/LevelHierarchy.hpp +165 -0
  363. package/vendor/include/networkit/numerics/LAMG/MultiLevelSetup.hpp +1090 -0
  364. package/vendor/include/networkit/numerics/LAMG/SolverLamg.hpp +316 -0
  365. package/vendor/include/networkit/numerics/LinearSolver.hpp +151 -0
  366. package/vendor/include/networkit/numerics/Preconditioner/DiagonalPreconditioner.hpp +61 -0
  367. package/vendor/include/networkit/numerics/Preconditioner/IdentityPreconditioner.hpp +36 -0
  368. package/vendor/include/networkit/numerics/Smoother.hpp +37 -0
  369. package/vendor/include/networkit/overlap/HashingOverlapper.hpp +28 -0
  370. package/vendor/include/networkit/overlap/Overlapper.hpp +27 -0
  371. package/vendor/include/networkit/planarity/LeftRightPlanarityCheck.hpp +113 -0
  372. package/vendor/include/networkit/randomization/Curveball.hpp +49 -0
  373. package/vendor/include/networkit/randomization/CurveballGlobalTradeGenerator.hpp +39 -0
  374. package/vendor/include/networkit/randomization/CurveballUniformTradeGenerator.hpp +39 -0
  375. package/vendor/include/networkit/randomization/DegreePreservingShuffle.hpp +82 -0
  376. package/vendor/include/networkit/randomization/EdgeSwitching.hpp +157 -0
  377. package/vendor/include/networkit/randomization/GlobalCurveball.hpp +69 -0
  378. package/vendor/include/networkit/randomization/GlobalTradeSequence.hpp +303 -0
  379. package/vendor/include/networkit/reachability/AllSimplePaths.hpp +122 -0
  380. package/vendor/include/networkit/reachability/ReachableNodes.hpp +83 -0
  381. package/vendor/include/networkit/scd/ApproximatePageRank.hpp +51 -0
  382. package/vendor/include/networkit/scd/CliqueDetect.hpp +55 -0
  383. package/vendor/include/networkit/scd/CombinedSCD.hpp +51 -0
  384. package/vendor/include/networkit/scd/GCE.hpp +42 -0
  385. package/vendor/include/networkit/scd/LFMLocal.hpp +54 -0
  386. package/vendor/include/networkit/scd/LocalT.hpp +40 -0
  387. package/vendor/include/networkit/scd/LocalTightnessExpansion.hpp +46 -0
  388. package/vendor/include/networkit/scd/PageRankNibble.hpp +55 -0
  389. package/vendor/include/networkit/scd/RandomBFS.hpp +33 -0
  390. package/vendor/include/networkit/scd/SCDGroundTruthComparison.hpp +121 -0
  391. package/vendor/include/networkit/scd/SelectiveCommunityDetector.hpp +76 -0
  392. package/vendor/include/networkit/scd/SetConductance.hpp +47 -0
  393. package/vendor/include/networkit/scd/TCE.hpp +41 -0
  394. package/vendor/include/networkit/scd/TwoPhaseL.hpp +40 -0
  395. package/vendor/include/networkit/scoring/EdgeScoring.hpp +44 -0
  396. package/vendor/include/networkit/scoring/ModularityScoring.hpp +79 -0
  397. package/vendor/include/networkit/simulation/EpidemicSimulationSEIR.hpp +59 -0
  398. package/vendor/include/networkit/sparsification/ChanceCorrectedTriangleScore.hpp +28 -0
  399. package/vendor/include/networkit/sparsification/ForestFireScore.hpp +34 -0
  400. package/vendor/include/networkit/sparsification/GlobalThresholdFilter.hpp +40 -0
  401. package/vendor/include/networkit/sparsification/LocalDegreeScore.hpp +30 -0
  402. package/vendor/include/networkit/sparsification/LocalFilterScore.hpp +124 -0
  403. package/vendor/include/networkit/sparsification/LocalSimilarityScore.hpp +63 -0
  404. package/vendor/include/networkit/sparsification/MultiscaleScore.hpp +38 -0
  405. package/vendor/include/networkit/sparsification/RandomEdgeScore.hpp +33 -0
  406. package/vendor/include/networkit/sparsification/RandomNodeEdgeScore.hpp +29 -0
  407. package/vendor/include/networkit/sparsification/SCANStructuralSimilarityScore.hpp +23 -0
  408. package/vendor/include/networkit/sparsification/SimmelianOverlapScore.hpp +35 -0
  409. package/vendor/include/networkit/sparsification/SimmelianScore.hpp +92 -0
  410. package/vendor/include/networkit/sparsification/Sparsifiers.hpp +166 -0
  411. package/vendor/include/networkit/structures/Cover.hpp +248 -0
  412. package/vendor/include/networkit/structures/LocalCommunity.hpp +363 -0
  413. package/vendor/include/networkit/structures/Partition.hpp +335 -0
  414. package/vendor/include/networkit/structures/UnionFind.hpp +66 -0
  415. package/vendor/include/networkit/viz/GraphLayoutAlgorithm.hpp +157 -0
  416. package/vendor/include/networkit/viz/MaxentStress.hpp +346 -0
  417. package/vendor/include/networkit/viz/Octree.hpp +428 -0
  418. package/vendor/include/networkit/viz/PivotMDS.hpp +63 -0
  419. package/vendor/include/networkit/viz/Point.hpp +415 -0
  420. package/vendor/include/networkit/viz/PostscriptWriter.hpp +78 -0
  421. package/vendor/include/tlx/algorithm/exclusive_scan.hpp +56 -0
  422. package/vendor/include/tlx/algorithm/is_sorted_cmp.hpp +56 -0
  423. package/vendor/include/tlx/algorithm/merge_advance.hpp +177 -0
  424. package/vendor/include/tlx/algorithm/merge_combine.hpp +76 -0
  425. package/vendor/include/tlx/algorithm/multisequence_partition.hpp +346 -0
  426. package/vendor/include/tlx/algorithm/multisequence_selection.hpp +351 -0
  427. package/vendor/include/tlx/algorithm/multiway_merge.hpp +1385 -0
  428. package/vendor/include/tlx/algorithm/multiway_merge_splitting.hpp +257 -0
  429. package/vendor/include/tlx/algorithm/parallel_multiway_merge.hpp +408 -0
  430. package/vendor/include/tlx/algorithm/random_bipartition_shuffle.hpp +116 -0
  431. package/vendor/include/tlx/algorithm.hpp +36 -0
  432. package/vendor/include/tlx/allocator_base.hpp +100 -0
  433. package/vendor/include/tlx/backtrace.hpp +54 -0
  434. package/vendor/include/tlx/cmdline_parser.hpp +498 -0
  435. package/vendor/include/tlx/container/btree.hpp +3977 -0
  436. package/vendor/include/tlx/container/btree_map.hpp +634 -0
  437. package/vendor/include/tlx/container/btree_multimap.hpp +627 -0
  438. package/vendor/include/tlx/container/btree_multiset.hpp +612 -0
  439. package/vendor/include/tlx/container/btree_set.hpp +612 -0
  440. package/vendor/include/tlx/container/d_ary_addressable_int_heap.hpp +416 -0
  441. package/vendor/include/tlx/container/d_ary_heap.hpp +311 -0
  442. package/vendor/include/tlx/container/loser_tree.hpp +1009 -0
  443. package/vendor/include/tlx/container/lru_cache.hpp +319 -0
  444. package/vendor/include/tlx/container/radix_heap.hpp +735 -0
  445. package/vendor/include/tlx/container/ring_buffer.hpp +428 -0
  446. package/vendor/include/tlx/container/simple_vector.hpp +304 -0
  447. package/vendor/include/tlx/container/splay_tree.hpp +399 -0
  448. package/vendor/include/tlx/container/string_view.hpp +805 -0
  449. package/vendor/include/tlx/container.hpp +40 -0
  450. package/vendor/include/tlx/counting_ptr.hpp +522 -0
  451. package/vendor/include/tlx/define/attribute_always_inline.hpp +34 -0
  452. package/vendor/include/tlx/define/attribute_fallthrough.hpp +36 -0
  453. package/vendor/include/tlx/define/attribute_format_printf.hpp +34 -0
  454. package/vendor/include/tlx/define/attribute_packed.hpp +34 -0
  455. package/vendor/include/tlx/define/attribute_warn_unused_result.hpp +34 -0
  456. package/vendor/include/tlx/define/constexpr.hpp +31 -0
  457. package/vendor/include/tlx/define/deprecated.hpp +39 -0
  458. package/vendor/include/tlx/define/endian.hpp +49 -0
  459. package/vendor/include/tlx/define/likely.hpp +33 -0
  460. package/vendor/include/tlx/define/visibility_hidden.hpp +34 -0
  461. package/vendor/include/tlx/define.hpp +36 -0
  462. package/vendor/include/tlx/delegate.hpp +524 -0
  463. package/vendor/include/tlx/die/core.hpp +311 -0
  464. package/vendor/include/tlx/die.hpp +106 -0
  465. package/vendor/include/tlx/digest/md5.hpp +81 -0
  466. package/vendor/include/tlx/digest/sha1.hpp +81 -0
  467. package/vendor/include/tlx/digest/sha256.hpp +81 -0
  468. package/vendor/include/tlx/digest/sha512.hpp +81 -0
  469. package/vendor/include/tlx/digest.hpp +30 -0
  470. package/vendor/include/tlx/logger/all.hpp +33 -0
  471. package/vendor/include/tlx/logger/array.hpp +43 -0
  472. package/vendor/include/tlx/logger/core.hpp +287 -0
  473. package/vendor/include/tlx/logger/deque.hpp +42 -0
  474. package/vendor/include/tlx/logger/map.hpp +65 -0
  475. package/vendor/include/tlx/logger/set.hpp +60 -0
  476. package/vendor/include/tlx/logger/tuple.hpp +66 -0
  477. package/vendor/include/tlx/logger/unordered_map.hpp +68 -0
  478. package/vendor/include/tlx/logger/unordered_set.hpp +64 -0
  479. package/vendor/include/tlx/logger/wrap_unprintable.hpp +75 -0
  480. package/vendor/include/tlx/logger.hpp +44 -0
  481. package/vendor/include/tlx/math/abs_diff.hpp +35 -0
  482. package/vendor/include/tlx/math/aggregate.hpp +231 -0
  483. package/vendor/include/tlx/math/aggregate_min_max.hpp +116 -0
  484. package/vendor/include/tlx/math/bswap.hpp +148 -0
  485. package/vendor/include/tlx/math/bswap_be.hpp +79 -0
  486. package/vendor/include/tlx/math/bswap_le.hpp +79 -0
  487. package/vendor/include/tlx/math/clz.hpp +174 -0
  488. package/vendor/include/tlx/math/ctz.hpp +174 -0
  489. package/vendor/include/tlx/math/div_ceil.hpp +36 -0
  490. package/vendor/include/tlx/math/ffs.hpp +123 -0
  491. package/vendor/include/tlx/math/integer_log2.hpp +189 -0
  492. package/vendor/include/tlx/math/is_power_of_two.hpp +74 -0
  493. package/vendor/include/tlx/math/polynomial_regression.hpp +243 -0
  494. package/vendor/include/tlx/math/popcount.hpp +173 -0
  495. package/vendor/include/tlx/math/power_to_the.hpp +44 -0
  496. package/vendor/include/tlx/math/rol.hpp +112 -0
  497. package/vendor/include/tlx/math/ror.hpp +112 -0
  498. package/vendor/include/tlx/math/round_to_power_of_two.hpp +121 -0
  499. package/vendor/include/tlx/math/round_up.hpp +36 -0
  500. package/vendor/include/tlx/math/sgn.hpp +38 -0
  501. package/vendor/include/tlx/math.hpp +46 -0
  502. package/vendor/include/tlx/meta/apply_tuple.hpp +55 -0
  503. package/vendor/include/tlx/meta/call_for_range.hpp +78 -0
  504. package/vendor/include/tlx/meta/call_foreach.hpp +60 -0
  505. package/vendor/include/tlx/meta/call_foreach_tuple.hpp +60 -0
  506. package/vendor/include/tlx/meta/call_foreach_tuple_with_index.hpp +61 -0
  507. package/vendor/include/tlx/meta/call_foreach_with_index.hpp +64 -0
  508. package/vendor/include/tlx/meta/enable_if.hpp +37 -0
  509. package/vendor/include/tlx/meta/fold_left.hpp +63 -0
  510. package/vendor/include/tlx/meta/fold_left_tuple.hpp +60 -0
  511. package/vendor/include/tlx/meta/fold_right.hpp +63 -0
  512. package/vendor/include/tlx/meta/fold_right_tuple.hpp +60 -0
  513. package/vendor/include/tlx/meta/function_chain.hpp +197 -0
  514. package/vendor/include/tlx/meta/function_stack.hpp +189 -0
  515. package/vendor/include/tlx/meta/has_member.hpp +80 -0
  516. package/vendor/include/tlx/meta/has_method.hpp +117 -0
  517. package/vendor/include/tlx/meta/index_sequence.hpp +66 -0
  518. package/vendor/include/tlx/meta/is_std_array.hpp +40 -0
  519. package/vendor/include/tlx/meta/is_std_pair.hpp +39 -0
  520. package/vendor/include/tlx/meta/is_std_tuple.hpp +39 -0
  521. package/vendor/include/tlx/meta/is_std_vector.hpp +39 -0
  522. package/vendor/include/tlx/meta/log2.hpp +101 -0
  523. package/vendor/include/tlx/meta/no_operation.hpp +55 -0
  524. package/vendor/include/tlx/meta/static_index.hpp +42 -0
  525. package/vendor/include/tlx/meta/vexpand.hpp +34 -0
  526. package/vendor/include/tlx/meta/vmap_for_range.hpp +84 -0
  527. package/vendor/include/tlx/meta/vmap_foreach.hpp +63 -0
  528. package/vendor/include/tlx/meta/vmap_foreach_tuple.hpp +59 -0
  529. package/vendor/include/tlx/meta/vmap_foreach_tuple_with_index.hpp +62 -0
  530. package/vendor/include/tlx/meta/vmap_foreach_with_index.hpp +70 -0
  531. package/vendor/include/tlx/meta.hpp +55 -0
  532. package/vendor/include/tlx/multi_timer.hpp +148 -0
  533. package/vendor/include/tlx/port/setenv.hpp +31 -0
  534. package/vendor/include/tlx/port.hpp +27 -0
  535. package/vendor/include/tlx/semaphore.hpp +119 -0
  536. package/vendor/include/tlx/simple_vector.hpp +20 -0
  537. package/vendor/include/tlx/siphash.hpp +282 -0
  538. package/vendor/include/tlx/sort/networks/best.hpp +611 -0
  539. package/vendor/include/tlx/sort/networks/bose_nelson.hpp +412 -0
  540. package/vendor/include/tlx/sort/networks/bose_nelson_parameter.hpp +507 -0
  541. package/vendor/include/tlx/sort/networks/cswap.hpp +60 -0
  542. package/vendor/include/tlx/sort/parallel_mergesort.hpp +398 -0
  543. package/vendor/include/tlx/sort/strings/insertion_sort.hpp +232 -0
  544. package/vendor/include/tlx/sort/strings/multikey_quicksort.hpp +185 -0
  545. package/vendor/include/tlx/sort/strings/parallel_sample_sort.hpp +1647 -0
  546. package/vendor/include/tlx/sort/strings/radix_sort.hpp +934 -0
  547. package/vendor/include/tlx/sort/strings/sample_sort_tools.hpp +756 -0
  548. package/vendor/include/tlx/sort/strings/string_ptr.hpp +426 -0
  549. package/vendor/include/tlx/sort/strings/string_set.hpp +800 -0
  550. package/vendor/include/tlx/sort/strings.hpp +329 -0
  551. package/vendor/include/tlx/sort/strings_parallel.hpp +325 -0
  552. package/vendor/include/tlx/sort.hpp +29 -0
  553. package/vendor/include/tlx/stack_allocator.hpp +226 -0
  554. package/vendor/include/tlx/string/appendline.hpp +35 -0
  555. package/vendor/include/tlx/string/base64.hpp +87 -0
  556. package/vendor/include/tlx/string/bitdump.hpp +139 -0
  557. package/vendor/include/tlx/string/compare_icase.hpp +42 -0
  558. package/vendor/include/tlx/string/contains.hpp +36 -0
  559. package/vendor/include/tlx/string/contains_word.hpp +42 -0
  560. package/vendor/include/tlx/string/ends_with.hpp +79 -0
  561. package/vendor/include/tlx/string/equal_icase.hpp +42 -0
  562. package/vendor/include/tlx/string/erase_all.hpp +70 -0
  563. package/vendor/include/tlx/string/escape_html.hpp +34 -0
  564. package/vendor/include/tlx/string/escape_uri.hpp +34 -0
  565. package/vendor/include/tlx/string/expand_environment_variables.hpp +49 -0
  566. package/vendor/include/tlx/string/extract_between.hpp +40 -0
  567. package/vendor/include/tlx/string/format_iec_units.hpp +32 -0
  568. package/vendor/include/tlx/string/format_si_iec_units.hpp +19 -0
  569. package/vendor/include/tlx/string/format_si_units.hpp +32 -0
  570. package/vendor/include/tlx/string/hash_djb2.hpp +87 -0
  571. package/vendor/include/tlx/string/hash_sdbm.hpp +86 -0
  572. package/vendor/include/tlx/string/hexdump.hpp +154 -0
  573. package/vendor/include/tlx/string/index_of.hpp +56 -0
  574. package/vendor/include/tlx/string/join.hpp +65 -0
  575. package/vendor/include/tlx/string/join_generic.hpp +89 -0
  576. package/vendor/include/tlx/string/join_quoted.hpp +46 -0
  577. package/vendor/include/tlx/string/less_icase.hpp +64 -0
  578. package/vendor/include/tlx/string/levenshtein.hpp +193 -0
  579. package/vendor/include/tlx/string/pad.hpp +39 -0
  580. package/vendor/include/tlx/string/parse_si_iec_units.hpp +46 -0
  581. package/vendor/include/tlx/string/parse_uri.hpp +66 -0
  582. package/vendor/include/tlx/string/parse_uri_form_data.hpp +136 -0
  583. package/vendor/include/tlx/string/replace.hpp +141 -0
  584. package/vendor/include/tlx/string/split.hpp +170 -0
  585. package/vendor/include/tlx/string/split_quoted.hpp +49 -0
  586. package/vendor/include/tlx/string/split_view.hpp +218 -0
  587. package/vendor/include/tlx/string/split_words.hpp +53 -0
  588. package/vendor/include/tlx/string/ssprintf.hpp +45 -0
  589. package/vendor/include/tlx/string/ssprintf_generic.hpp +95 -0
  590. package/vendor/include/tlx/string/starts_with.hpp +44 -0
  591. package/vendor/include/tlx/string/to_lower.hpp +47 -0
  592. package/vendor/include/tlx/string/to_upper.hpp +47 -0
  593. package/vendor/include/tlx/string/trim.hpp +298 -0
  594. package/vendor/include/tlx/string/union_words.hpp +33 -0
  595. package/vendor/include/tlx/string/word_wrap.hpp +35 -0
  596. package/vendor/include/tlx/string.hpp +68 -0
  597. package/vendor/include/tlx/thread_barrier_mutex.hpp +109 -0
  598. package/vendor/include/tlx/thread_barrier_spin.hpp +127 -0
  599. package/vendor/include/tlx/thread_pool.hpp +151 -0
  600. package/vendor/include/tlx/timestamp.hpp +23 -0
  601. package/vendor/include/tlx/unused.hpp +28 -0
  602. package/vendor/include/tlx/vector_free.hpp +30 -0
  603. package/vendor/include/tlx/version.hpp +49 -0
  604. package/vendor/include/ttmath/ttmath.h +2881 -0
  605. package/vendor/include/ttmath/ttmathbig.h +6111 -0
  606. package/vendor/include/ttmath/ttmathdec.h +419 -0
  607. package/vendor/include/ttmath/ttmathint.h +1923 -0
  608. package/vendor/include/ttmath/ttmathmisc.h +250 -0
  609. package/vendor/include/ttmath/ttmathobjects.h +812 -0
  610. package/vendor/include/ttmath/ttmathparser.h +2791 -0
  611. package/vendor/include/ttmath/ttmaththreads.h +252 -0
  612. package/vendor/include/ttmath/ttmathtypes.h +707 -0
  613. package/vendor/include/ttmath/ttmathuint.h +4190 -0
  614. package/vendor/include/ttmath/ttmathuint_noasm.h +1038 -0
  615. package/vendor/include/ttmath/ttmathuint_x86.h +1620 -0
  616. package/vendor/include/ttmath/ttmathuint_x86_64.h +1177 -0
  617. package/vendor/lib/cmake/tlx/tlx-config.cmake +51 -0
  618. package/vendor/lib/cmake/tlx/tlx-targets-release.cmake +19 -0
  619. package/vendor/lib/cmake/tlx/tlx-targets.cmake +106 -0
  620. package/vendor/lib/cmake/tlx/tlx-version.cmake +11 -0
  621. package/vendor/lib/libnetworkit.dylib +0 -0
  622. package/vendor/lib/libtlx.a +0 -0
  623. package/vendor/lib/pkgconfig/networkit.pc +11 -0
  624. package/vendor/lib/pkgconfig/tlx.pc +11 -0
@@ -0,0 +1,1647 @@
1
+ /*******************************************************************************
2
+ * tlx/sort/strings/parallel_sample_sort.hpp
3
+ *
4
+ * Parallel Super Scalar String Sample Sort (pS5)
5
+ *
6
+ * See also Timo Bingmann, Andreas Eberle, and Peter Sanders. "Engineering
7
+ * parallel string sorting." Algorithmica 77.1 (2017): 235-286.
8
+ *
9
+ * Part of tlx - http://panthema.net/tlx
10
+ *
11
+ * Copyright (C) 2013-2019 Timo Bingmann <tb@panthema.net>
12
+ *
13
+ * All rights reserved. Published under the Boost Software License, Version 1.0
14
+ ******************************************************************************/
15
+
16
+ #ifndef TLX_SORT_STRINGS_PARALLEL_SAMPLE_SORT_HEADER
17
+ #define TLX_SORT_STRINGS_PARALLEL_SAMPLE_SORT_HEADER
18
+
19
+ #include <tlx/logger/core.hpp>
20
+ #include <tlx/math/clz.hpp>
21
+ #include <tlx/math/ctz.hpp>
22
+ #include <tlx/meta/enable_if.hpp>
23
+ #include <tlx/multi_timer.hpp>
24
+ #include <tlx/simple_vector.hpp>
25
+ #include <tlx/sort/strings/insertion_sort.hpp>
26
+ #include <tlx/sort/strings/sample_sort_tools.hpp>
27
+ #include <tlx/sort/strings/string_ptr.hpp>
28
+ #include <tlx/thread_pool.hpp>
29
+ #include <tlx/unused.hpp>
30
+ #include <algorithm>
31
+ #include <atomic>
32
+ #include <cmath>
33
+ #include <cstdint>
34
+ #include <cstdlib>
35
+ #include <cstring>
36
+ #include <random>
37
+ #include <vector>
38
+
39
+ namespace tlx { namespace sort_strings_detail {
40
+
41
+ class PS5SortStep;
42
+
43
+ /******************************************************************************/
44
+ //! Parallel Super Scalar String Sample Sort Parameter Struct
45
+
46
+ class PS5ParametersDefault
47
+ {
48
+ public:
49
+ static const bool debug_steps = false;
50
+ static const bool debug_jobs = false;
51
+
52
+ static const bool debug_bucket_size = false;
53
+ static const bool debug_recursion = false;
54
+ static const bool debug_lcp = false;
55
+
56
+ static const bool debug_result = false;
57
+
58
+ //! enable/disable various sorting levels
59
+ static const bool enable_parallel_sample_sort = true;
60
+ static const bool enable_sequential_sample_sort = true;
61
+ static const bool enable_sequential_mkqs = true;
62
+
63
+ //! terminate sort after first parallel sample sort step
64
+ static const bool use_only_first_sortstep = false;
65
+
66
+ //! enable work freeing
67
+ static const bool enable_work_sharing = true;
68
+
69
+ //! whether the base sequential_threshold() on the remaining unsorted string
70
+ //! set or on the whole string set.
71
+ static const bool enable_rest_size = false;
72
+
73
+ //! key type for sample sort: 32-bit or 64-bit
74
+ typedef size_t key_type;
75
+
76
+ //! depth of classification tree used in sample sorts
77
+ static const unsigned TreeBits = 10;
78
+
79
+ //! classification tree variant for sample sorts
80
+ using Classify = SSClassifyTreeCalcUnrollInterleave<key_type, TreeBits>;
81
+
82
+ //! threshold to run sequential small sorts
83
+ static const size_t smallsort_threshold = 1024 * 1024;
84
+ //! threshold to switch to insertion sort
85
+ static const size_t inssort_threshold = 32;
86
+ };
87
+
88
+ /******************************************************************************/
89
+ //! Parallel Super Scalar String Sample Sort Context
90
+
91
+ template <typename Parameters>
92
+ class PS5Context : public Parameters
93
+ {
94
+ public:
95
+ //! total size of input
96
+ size_t total_size;
97
+
98
+ //! number of remaining strings to sort
99
+ std::atomic<size_t> rest_size;
100
+
101
+ //! counters
102
+ std::atomic<size_t> para_ss_steps, sequ_ss_steps, base_sort_steps;
103
+
104
+ //! timers for individual sorting steps
105
+ MultiTimer mtimer;
106
+
107
+ //! number of threads overall
108
+ size_t num_threads;
109
+
110
+ //! thread pool
111
+ ThreadPool threads_;
112
+
113
+ //! context constructor
114
+ PS5Context(size_t _thread_num)
115
+ : para_ss_steps(0),
116
+ sequ_ss_steps(0),
117
+ base_sort_steps(0),
118
+ num_threads(_thread_num),
119
+ threads_(_thread_num)
120
+ {
121
+ }
122
+
123
+ //! enqueue a new job in the thread pool
124
+ template <typename StringPtr>
125
+ void enqueue(PS5SortStep* pstep, const StringPtr& strptr, size_t depth);
126
+
127
+ //! return sequential sorting threshold
128
+ size_t sequential_threshold()
129
+ {
130
+ size_t threshold = this->smallsort_threshold;
131
+ if (this->enable_rest_size)
132
+ return std::max(threshold, rest_size / num_threads);
133
+ return std::max(threshold, total_size / num_threads);
134
+ }
135
+
136
+ //! decrement number of unordered strings
137
+ void donesize(size_t n)
138
+ {
139
+ if (this->enable_rest_size)
140
+ rest_size -= n;
141
+ }
142
+ };
143
+
144
+ /******************************************************************************/
145
+ //! LCP calculation of Splitter Strings
146
+
147
+ template <typename KeyType>
148
+ static inline unsigned char lcpKeyType(const KeyType& a, const KeyType& b)
149
+ {
150
+ // XOR both values and count the number of zero bytes
151
+ return clz(a ^ b) / 8;
152
+ }
153
+
154
+ template <typename KeyType>
155
+ static inline unsigned char lcpKeyDepth(const KeyType& a)
156
+ {
157
+ // count number of non-zero bytes
158
+ return sizeof(KeyType) - (ctz(a) / 8);
159
+ }
160
+
161
+ //! return the d-th character in the (swapped) key
162
+ template <typename KeyType>
163
+ static inline unsigned char getCharAtDepth(const KeyType& a, unsigned char d)
164
+ {
165
+ return static_cast<unsigned char>(a >> (8 * (sizeof(KeyType) - 1 - d)));
166
+ }
167
+
168
+ /******************************************************************************/
169
+ //! PS5SortStep Top-Level Class to Keep Track of Substeps
170
+
171
+ class PS5SortStep
172
+ {
173
+ private:
174
+ //! Number of substeps still running
175
+ std::atomic<size_t> substep_working_;
176
+
177
+ //! Pure virtual function called by substep when all substeps are done.
178
+ virtual void substep_all_done() = 0;
179
+
180
+ protected:
181
+ PS5SortStep() : substep_working_(0)
182
+ {
183
+ }
184
+
185
+ ~PS5SortStep()
186
+ {
187
+ assert(substep_working_ == 0);
188
+ }
189
+
190
+ //! Register new substep
191
+ void substep_add()
192
+ {
193
+ ++substep_working_;
194
+ }
195
+
196
+ public:
197
+ //! Notify superstep that the currently substep is done.
198
+ void substep_notify_done()
199
+ {
200
+ assert(substep_working_ > 0);
201
+ if (--substep_working_ == 0)
202
+ substep_all_done();
203
+ }
204
+ };
205
+
206
+ /******************************************************************************/
207
+ //! LCP Calculation for Finished Sample Sort Steps
208
+
209
+ template <size_t bktnum, typename Context, typename Classify,
210
+ typename StringPtr, typename BktSizeType>
211
+ void ps5_sample_sort_lcp(const Context& ctx, const Classify& classifier,
212
+ const StringPtr& strptr, size_t depth,
213
+ const BktSizeType* bkt)
214
+ {
215
+ assert(!strptr.flipped());
216
+
217
+ const typename StringPtr::StringSet& strset = strptr.active();
218
+ typedef typename Context::key_type key_type;
219
+
220
+ size_t b = 0; // current bucket number
221
+ key_type prevkey = 0; // previous key
222
+
223
+ // the following while loops only check b < bktnum when b is odd,
224
+ // because bktnum is always odd. We need a goto to jump into the loop,
225
+ // as b == 0 start even.
226
+ goto even_first;
227
+
228
+ // find first non-empty bucket
229
+ while (b < bktnum)
230
+ {
231
+ // odd bucket: = bkt
232
+ if (bkt[b] != bkt[b + 1])
233
+ {
234
+ prevkey = classifier.get_splitter(b / 2);
235
+ assert(prevkey ==
236
+ get_key_at<key_type>(strset, bkt[b + 1] - 1, depth));
237
+ break;
238
+ }
239
+ ++b;
240
+ even_first:
241
+ // even bucket: <, << or > bkt
242
+ if (bkt[b] != bkt[b + 1])
243
+ {
244
+ prevkey = get_key_at<key_type>(strset, bkt[b + 1] - 1, depth);
245
+ break;
246
+ }
247
+ ++b;
248
+ }
249
+ ++b;
250
+
251
+ // goto depends on whether the first non-empty bucket was odd or
252
+ // even. the while loop below encodes this in the program counter.
253
+ if (b < bktnum && b % 2 == 0)
254
+ goto even_bucket;
255
+
256
+ // find next non-empty bucket
257
+ while (b < bktnum)
258
+ {
259
+ // odd bucket: = bkt
260
+ if (bkt[b] != bkt[b + 1])
261
+ {
262
+ key_type thiskey = classifier.get_splitter(b / 2);
263
+ assert(thiskey == get_key_at<key_type>(strset, bkt[b], depth));
264
+
265
+ int rlcp = lcpKeyType(prevkey, thiskey);
266
+ strptr.set_lcp(bkt[b], depth + rlcp);
267
+ // strptr.set_cache(bkt[b], getCharAtDepth(thiskey, rlcp));
268
+
269
+ TLX_LOGC(ctx.debug_lcp) << "LCP at odd-bucket " << b << " ["
270
+ << bkt[b] << "," << bkt[b + 1] << ")"
271
+ << " is " << depth + rlcp;
272
+
273
+ prevkey = thiskey;
274
+ assert(prevkey ==
275
+ get_key_at<key_type>(strset, bkt[b + 1] - 1, depth));
276
+ }
277
+ ++b;
278
+ even_bucket:
279
+ // even bucket: <, << or > bkt
280
+ if (bkt[b] != bkt[b + 1])
281
+ {
282
+ key_type thiskey = get_key_at<key_type>(strset, bkt[b], depth);
283
+
284
+ int rlcp = lcpKeyType(prevkey, thiskey);
285
+ strptr.set_lcp(bkt[b], depth + rlcp);
286
+ // strptr.set_cache(bkt[b], getCharAtDepth(thiskey, rlcp));
287
+
288
+ TLX_LOGC(ctx.debug_lcp) << "LCP at even-bucket " << b << " ["
289
+ << bkt[b] << "," << bkt[b + 1] << ")"
290
+ << " is " << depth + rlcp;
291
+
292
+ prevkey = get_key_at<key_type>(strset, bkt[b + 1] - 1, depth);
293
+ }
294
+ ++b;
295
+ }
296
+ }
297
+
298
+ /******************************************************************************/
299
+ //! SampleSort: Non-Recursive In-Place Sequential Sample Sort for Small Sorts
300
+
301
+ template <typename Context, typename StringPtr, typename BktSizeType>
302
+ class PS5SmallsortJob : public PS5SortStep
303
+ {
304
+ public:
305
+ Context& ctx_;
306
+
307
+ //! parent sort step
308
+ PS5SortStep* pstep_;
309
+
310
+ StringPtr strptr_;
311
+ size_t depth_;
312
+ MultiTimer mtimer_;
313
+
314
+ typedef typename Context::key_type key_type;
315
+ typedef typename StringPtr::StringSet StringSet;
316
+ typedef BktSizeType bktsize_type;
317
+
318
+ PS5SmallsortJob(Context& ctx, PS5SortStep* pstep, const StringPtr& strptr,
319
+ size_t depth)
320
+ : ctx_(ctx), pstep_(pstep), strptr_(strptr), depth_(depth)
321
+ {
322
+ TLX_LOGC(ctx_.debug_steps)
323
+ << "enqueue depth=" << depth_ << " size=" << strptr_.size()
324
+ << " flip=" << strptr_.flipped();
325
+ }
326
+
327
+ virtual ~PS5SmallsortJob()
328
+ {
329
+ mtimer_.stop();
330
+ ctx_.mtimer.add(mtimer_);
331
+ }
332
+
333
+ simple_vector<std::uint8_t> bktcache_;
334
+ size_t bktcache_size_ = 0;
335
+
336
+ void run()
337
+ {
338
+ mtimer_.start("sequ_ss");
339
+
340
+ size_t n = strptr_.size();
341
+
342
+ TLX_LOGC(ctx_.debug_jobs)
343
+ << "Process PS5SmallsortJob " << this << " of size " << n;
344
+
345
+ // create anonymous wrapper job
346
+ this->substep_add();
347
+
348
+ if (ctx_.enable_sequential_sample_sort && n >= ctx_.smallsort_threshold)
349
+ {
350
+ bktcache_.resize(n * sizeof(std::uint16_t));
351
+ sort_sample_sort(strptr_, depth_);
352
+ }
353
+ else
354
+ {
355
+ mtimer_.start("mkqs");
356
+ sort_mkqs_cache(strptr_, depth_);
357
+ }
358
+
359
+ // finish wrapper job, handler delete's this
360
+ this->substep_notify_done();
361
+ }
362
+
363
+ /*------------------------------------------------------------------------*/
364
+ //! Stack of Recursive Sample Sort Steps
365
+
366
+ class SeqSampleSortStep
367
+ {
368
+ public:
369
+ StringPtr strptr_;
370
+ size_t idx_ = 0;
371
+ size_t depth_;
372
+
373
+ using StringSet = typename StringPtr::StringSet;
374
+ using bktsize_type = BktSizeType;
375
+
376
+ typename Context::Classify classifier;
377
+
378
+ static const size_t num_splitters = Context::Classify::num_splitters;
379
+ static const size_t bktnum = 2 * num_splitters + 1;
380
+
381
+ unsigned char splitter_lcp[num_splitters + 1];
382
+ bktsize_type bkt[bktnum + 1];
383
+
384
+ SeqSampleSortStep(Context& ctx, const StringPtr& strptr, size_t depth,
385
+ std::uint16_t* bktcache)
386
+ : strptr_(strptr), depth_(depth)
387
+ {
388
+ size_t n = strptr_.size();
389
+
390
+ // step 1: select splitters with oversampling
391
+
392
+ const size_t oversample_factor = 2;
393
+ const size_t sample_size = oversample_factor * num_splitters;
394
+
395
+ simple_vector<key_type> samples(sample_size);
396
+
397
+ const StringSet& strset = strptr_.active();
398
+
399
+ std::minstd_rand rng(reinterpret_cast<uintptr_t>(samples.data()));
400
+
401
+ for (size_t i = 0; i < sample_size; ++i)
402
+ samples[i] = get_key_at<key_type>(strset, rng() % n, depth_);
403
+
404
+ std::sort(samples.begin(), samples.end());
405
+
406
+ classifier.build(samples.data(), sample_size, splitter_lcp);
407
+
408
+ // step 2: classify all strings
409
+
410
+ classifier.classify(strset, strset.begin(), strset.end(), bktcache,
411
+ depth_);
412
+
413
+ // step 2.5: count bucket sizes
414
+
415
+ bktsize_type bktsize[bktnum];
416
+ memset(bktsize, 0, bktnum * sizeof(bktsize_type));
417
+
418
+ for (size_t si = 0; si < n; ++si)
419
+ ++bktsize[bktcache[si]];
420
+
421
+ // step 3: inclusive prefix sum
422
+
423
+ bkt[0] = bktsize[0];
424
+ for (unsigned int i = 1; i < bktnum; ++i)
425
+ {
426
+ bkt[i] = bkt[i - 1] + bktsize[i];
427
+ }
428
+ assert(bkt[bktnum - 1] == n);
429
+ bkt[bktnum] = n;
430
+
431
+ // step 4: premute out-of-place
432
+
433
+ const StringSet& strB = strptr_.active();
434
+ // get alternative shadow pointer array
435
+ const StringSet& sorted = strptr_.shadow();
436
+ typename StringSet::Iterator sbegin = sorted.begin();
437
+
438
+ for (typename StringSet::Iterator str = strB.begin();
439
+ str != strB.end(); ++str, ++bktcache)
440
+ *(sbegin + --bkt[*bktcache]) = std::move(*str);
441
+
442
+ // bkt is afterwards the exclusive prefix sum of bktsize
443
+
444
+ // statistics
445
+
446
+ ++ctx.sequ_ss_steps;
447
+ }
448
+
449
+ void calculate_lcp(Context& ctx)
450
+ {
451
+ TLX_LOGC(ctx.debug_lcp) << "Calculate LCP after sample sort step";
452
+ if (strptr_.with_lcp)
453
+ {
454
+ ps5_sample_sort_lcp<bktnum>(ctx, classifier, strptr_, depth_,
455
+ bkt);
456
+ }
457
+ }
458
+ };
459
+
460
+ size_t ss_front_ = 0;
461
+ std::vector<SeqSampleSortStep> ss_stack_;
462
+
463
+ void sort_sample_sort(const StringPtr& strptr, size_t depth)
464
+ {
465
+ typedef SeqSampleSortStep Step;
466
+
467
+ assert(ss_front_ == 0);
468
+ assert(ss_stack_.empty());
469
+
470
+ std::uint16_t* bktcache =
471
+ reinterpret_cast<std::uint16_t*>(bktcache_.data());
472
+
473
+ // sort first level
474
+ ss_stack_.emplace_back(ctx_, strptr, depth, bktcache);
475
+
476
+ // step 5: "recursion"
477
+
478
+ while (ss_stack_.size() > ss_front_)
479
+ {
480
+ Step& s = ss_stack_.back();
481
+ size_t i = s.idx_++; // process the bucket s.idx_
482
+
483
+ if (i < Step::bktnum)
484
+ {
485
+ size_t bktsize = s.bkt[i + 1] - s.bkt[i];
486
+
487
+ StringPtr sp = s.strptr_.flip(s.bkt[i], bktsize);
488
+
489
+ // i is even -> bkt[i] is less-than bucket
490
+ if (i % 2 == 0)
491
+ {
492
+ if (bktsize == 0)
493
+ {
494
+ // empty bucket
495
+ }
496
+ else if (bktsize < ctx_.smallsort_threshold)
497
+ {
498
+ assert(i / 2 <= Step::num_splitters);
499
+ if (i == Step::bktnum - 1)
500
+ TLX_LOGC(ctx_.debug_recursion)
501
+ << "Recurse[" << s.depth_ << "]: > bkt " << i
502
+ << " size " << bktsize << " no lcp";
503
+ else
504
+ TLX_LOGC(ctx_.debug_recursion)
505
+ << "Recurse[" << s.depth_ << "]: < bkt " << i
506
+ << " size " << bktsize << " lcp "
507
+ << int(s.splitter_lcp[i / 2] & 0x7F);
508
+
509
+ ScopedMultiTimerSwitch sts_inssort(mtimer_, "mkqs");
510
+ sort_mkqs_cache(sp, s.depth_ +
511
+ (s.splitter_lcp[i / 2] & 0x7F));
512
+ }
513
+ else
514
+ {
515
+ if (i == Step::bktnum - 1)
516
+ TLX_LOGC(ctx_.debug_recursion)
517
+ << "Recurse[" << s.depth_ << "]: > bkt " << i
518
+ << " size " << bktsize << " no lcp";
519
+ else
520
+ TLX_LOGC(ctx_.debug_recursion)
521
+ << "Recurse[" << s.depth_ << "]: < bkt " << i
522
+ << " size " << bktsize << " lcp "
523
+ << int(s.splitter_lcp[i / 2] & 0x7F);
524
+
525
+ ss_stack_.emplace_back(
526
+ ctx_, sp, s.depth_ + (s.splitter_lcp[i / 2] & 0x7F),
527
+ bktcache);
528
+ }
529
+ }
530
+ // i is odd -> bkt[i] is equal bucket
531
+ else
532
+ {
533
+ if (bktsize == 0)
534
+ {
535
+ // empty bucket
536
+ }
537
+ else if (s.splitter_lcp[i / 2] & 0x80)
538
+ {
539
+ // equal-bucket has nullptr-terminated key, done.
540
+ TLX_LOGC(ctx_.debug_recursion)
541
+ << "Recurse[" << s.depth_ << "]: = bkt " << i
542
+ << " size " << bktsize << " is done!";
543
+ StringPtr spb = sp.copy_back();
544
+
545
+ if (sp.with_lcp)
546
+ {
547
+ spb.fill_lcp(
548
+ s.depth_ +
549
+ lcpKeyDepth(s.classifier.get_splitter(i / 2)));
550
+ }
551
+ ctx_.donesize(bktsize);
552
+ }
553
+ else if (bktsize < ctx_.smallsort_threshold)
554
+ {
555
+ TLX_LOGC(ctx_.debug_recursion)
556
+ << "Recurse[" << s.depth_ << "]: = bkt " << i
557
+ << " size " << bktsize << " lcp keydepth!";
558
+
559
+ ScopedMultiTimerSwitch sts_inssort(mtimer_, "mkqs");
560
+ sort_mkqs_cache(sp, s.depth_ + sizeof(key_type));
561
+ }
562
+ else
563
+ {
564
+ TLX_LOGC(ctx_.debug_recursion)
565
+ << "Recurse[" << s.depth_ << "]: = bkt " << i
566
+ << " size " << bktsize << " lcp keydepth!";
567
+
568
+ ss_stack_.emplace_back(
569
+ ctx_, sp, s.depth_ + sizeof(key_type), bktcache);
570
+ }
571
+ }
572
+ }
573
+ else
574
+ {
575
+ // finished sort
576
+ assert(ss_stack_.size() > ss_front_);
577
+
578
+ // after full sort: calculate LCPs at this level
579
+ ss_stack_.back().calculate_lcp(ctx_);
580
+
581
+ ss_stack_.pop_back();
582
+ }
583
+
584
+ if (ctx_.enable_work_sharing && ctx_.threads_.has_idle())
585
+ {
586
+ sample_sort_free_work();
587
+ }
588
+ }
589
+ }
590
+
591
+ void sample_sort_free_work()
592
+ {
593
+ assert(ss_stack_.size() >= ss_front_);
594
+
595
+ if (ss_stack_.size() == ss_front_)
596
+ {
597
+ // ss_stack_ is empty, check other stack
598
+ return mkqs_free_work();
599
+ }
600
+
601
+ // convert top level of stack into independent jobs
602
+ TLX_LOGC(ctx_.debug_jobs)
603
+ << "Freeing top level of PS5SmallsortJob's sample_sort stack";
604
+
605
+ typedef SeqSampleSortStep Step;
606
+ Step& s = ss_stack_[ss_front_];
607
+
608
+ while (s.idx_ < Step::bktnum)
609
+ {
610
+ size_t i = s.idx_++; // process the bucket s.idx_
611
+
612
+ size_t bktsize = s.bkt[i + 1] - s.bkt[i];
613
+
614
+ StringPtr sp = s.strptr_.flip(s.bkt[i], bktsize);
615
+
616
+ // i is even -> bkt[i] is less-than bucket
617
+ if (i % 2 == 0)
618
+ {
619
+ if (bktsize == 0)
620
+ {
621
+ // empty bucket
622
+ }
623
+ else
624
+ {
625
+ if (i == Step::bktnum - 1)
626
+ TLX_LOGC(ctx_.debug_recursion)
627
+ << "Recurse[" << s.depth_ << "]: > bkt " << i
628
+ << " size " << bktsize << " no lcp";
629
+ else
630
+ TLX_LOGC(ctx_.debug_recursion)
631
+ << "Recurse[" << s.depth_ << "]: < bkt " << i
632
+ << " size " << bktsize << " lcp "
633
+ << int(s.splitter_lcp[i / 2] & 0x7F);
634
+
635
+ this->substep_add();
636
+ ctx_.enqueue(this, sp,
637
+ s.depth_ + (s.splitter_lcp[i / 2] & 0x7F));
638
+ }
639
+ }
640
+ // i is odd -> bkt[i] is equal bucket
641
+ else
642
+ {
643
+ if (bktsize == 0)
644
+ {
645
+ // empty bucket
646
+ }
647
+ else if (s.splitter_lcp[i / 2] & 0x80)
648
+ {
649
+ // equal-bucket has nullptr-terminated key, done.
650
+ TLX_LOGC(ctx_.debug_recursion)
651
+ << "Recurse[" << s.depth_ << "]: = bkt " << i
652
+ << " size " << bktsize << " is done!";
653
+ StringPtr spb = sp.copy_back();
654
+
655
+ if (sp.with_lcp)
656
+ {
657
+ spb.fill_lcp(
658
+ s.depth_ +
659
+ lcpKeyDepth(s.classifier.get_splitter(i / 2)));
660
+ }
661
+ ctx_.donesize(bktsize);
662
+ }
663
+ else
664
+ {
665
+ TLX_LOGC(ctx_.debug_recursion)
666
+ << "Recurse[" << s.depth_ << "]: = bkt " << i
667
+ << " size " << bktsize << " lcp keydepth!";
668
+
669
+ this->substep_add();
670
+ ctx_.enqueue(this, sp, s.depth_ + sizeof(key_type));
671
+ }
672
+ }
673
+ }
674
+
675
+ // shorten the current stack
676
+ ++ss_front_;
677
+ }
678
+
679
+ /*------------------------------------------------------------------------*/
680
+ //! Stack of Recursive MKQS Steps
681
+
682
+ static int cmp(const key_type& a, const key_type& b)
683
+ {
684
+ return (a > b) ? 1 : (a < b) ? -1 : 0;
685
+ }
686
+
687
+ template <typename Type>
688
+ static size_t med3(Type* A, size_t i, size_t j, size_t k)
689
+ {
690
+ if (A[i] == A[j])
691
+ return i;
692
+ if (A[k] == A[i] || A[k] == A[j])
693
+ return k;
694
+ if (A[i] < A[j])
695
+ {
696
+ if (A[j] < A[k])
697
+ return j;
698
+ if (A[i] < A[k])
699
+ return k;
700
+ return i;
701
+ }
702
+
703
+ if (A[j] > A[k])
704
+ return j;
705
+ if (A[i] < A[k])
706
+ return i;
707
+ return k;
708
+ }
709
+
710
+ //! Insertion sort the strings only based on the cached characters.
711
+ static void insertion_sort_cache_block(const StringPtr& strptr,
712
+ key_type* cache)
713
+ {
714
+ const StringSet& strings = strptr.active();
715
+ size_t n = strptr.size();
716
+ size_t pi, pj;
717
+ for (pi = 1; --n > 0; ++pi)
718
+ {
719
+ typename StringSet::String tmps = std::move(strings.at(pi));
720
+ key_type tmpc = cache[pi];
721
+ for (pj = pi; pj > 0; --pj)
722
+ {
723
+ if (cache[pj - 1] <= tmpc)
724
+ break;
725
+ strings.at(pj) = std::move(strings.at(pj - 1));
726
+ cache[pj] = cache[pj - 1];
727
+ }
728
+ strings.at(pj) = std::move(tmps);
729
+ cache[pj] = tmpc;
730
+ }
731
+ }
732
+
733
+ //! Insertion sort, but use cached characters if possible.
734
+ template <bool CacheDirty>
735
+ static void insertion_sort_cache(const StringPtr& _strptr, key_type* cache,
736
+ size_t depth)
737
+ {
738
+ StringPtr strptr = _strptr.copy_back();
739
+
740
+ if (strptr.size() <= 1)
741
+ return;
742
+ if (CacheDirty)
743
+ return insertion_sort(strptr, depth, /* memory */ 0);
744
+
745
+ insertion_sort_cache_block(strptr, cache);
746
+
747
+ size_t start = 0, bktsize = 1;
748
+ for (size_t i = 0; i < strptr.size() - 1; ++i)
749
+ {
750
+ // group areas with equal cache values
751
+ if (cache[i] == cache[i + 1])
752
+ {
753
+ ++bktsize;
754
+ continue;
755
+ }
756
+ // calculate LCP between group areas
757
+ if (start != 0 && strptr.with_lcp)
758
+ {
759
+ int rlcp = lcpKeyType(cache[start - 1], cache[start]);
760
+ strptr.set_lcp(start, depth + rlcp);
761
+ // strptr.set_cache(start, getCharAtDepth(cache[start], rlcp));
762
+ }
763
+ // sort group areas deeper if needed
764
+ if (bktsize > 1)
765
+ {
766
+ if (cache[start] & 0xFF)
767
+ {
768
+ // need deeper sort
769
+ insertion_sort(strptr.sub(start, bktsize),
770
+ depth + sizeof(key_type),
771
+ /* memory */ 0);
772
+ }
773
+ else
774
+ {
775
+ // cache contains nullptr-termination
776
+ strptr.sub(start, bktsize)
777
+ .fill_lcp(depth + lcpKeyDepth(cache[start]));
778
+ }
779
+ }
780
+ bktsize = 1;
781
+ start = i + 1;
782
+ }
783
+ // tail of loop for last item
784
+ if (start != 0 && strptr.with_lcp)
785
+ {
786
+ int rlcp = lcpKeyType(cache[start - 1], cache[start]);
787
+ strptr.set_lcp(start, depth + rlcp);
788
+ // strptr.set_cache(start, getCharAtDepth(cache[start], rlcp));
789
+ }
790
+ if (bktsize > 1)
791
+ {
792
+ if (cache[start] & 0xFF)
793
+ {
794
+ // need deeper sort
795
+ insertion_sort(strptr.sub(start, bktsize),
796
+ depth + sizeof(key_type),
797
+ /* memory */ 0);
798
+ }
799
+ else
800
+ {
801
+ // cache contains nullptr-termination
802
+ strptr.sub(start, bktsize)
803
+ .fill_lcp(depth + lcpKeyDepth(cache[start]));
804
+ }
805
+ }
806
+ }
807
+
808
+ class MKQSStep
809
+ {
810
+ public:
811
+ StringPtr strptr_;
812
+ key_type* cache_;
813
+ size_t num_lt_, num_eq_, num_gt_, depth_;
814
+ size_t idx_ = 0;
815
+ unsigned char eq_recurse_;
816
+ // typename StringPtr::StringSet::Char dchar_eq_, dchar_gt_;
817
+ std::uint8_t lcp_lt_, lcp_eq_, lcp_gt_;
818
+
819
+ MKQSStep(Context& ctx, const StringPtr& strptr, key_type* cache,
820
+ size_t depth, bool CacheDirty)
821
+ : strptr_(strptr), cache_(cache), depth_(depth)
822
+ {
823
+ size_t n = strptr_.size();
824
+
825
+ const StringSet& strset = strptr_.active();
826
+
827
+ if (CacheDirty)
828
+ {
829
+ typename StringSet::Iterator it = strset.begin();
830
+ for (size_t i = 0; i < n; ++i, ++it)
831
+ {
832
+ cache_[i] = get_key<key_type>(strset, *it, depth);
833
+ }
834
+ }
835
+ // select median of 9
836
+ size_t p = med3(cache_, med3(cache_, 0, n / 8, n / 4),
837
+ med3(cache_, n / 2 - n / 8, n / 2, n / 2 + n / 8),
838
+ med3(cache_, n - 1 - n / 4, n - 1 - n / 8, n - 3));
839
+ // swap pivot to first position
840
+ std::swap(strset.at(0), strset.at(p));
841
+ std::swap(cache_[0], cache_[p]);
842
+ // save the pivot value
843
+ key_type pivot = cache_[0];
844
+ // for immediate LCP calculation
845
+ key_type max_lt = 0, min_gt = std::numeric_limits<key_type>::max();
846
+
847
+ // indexes into array:
848
+ // 0 [pivot] 1 [===] leq [<<<] llt [???] rgt [>>>] req [===] n-1
849
+ size_t leq = 1, llt = 1, rgt = n - 1, req = n - 1;
850
+ while (true)
851
+ {
852
+ while (llt <= rgt)
853
+ {
854
+ int r = cmp(cache[llt], pivot);
855
+ if (r > 0)
856
+ {
857
+ min_gt = std::min(min_gt, cache[llt]);
858
+ break;
859
+ }
860
+ if (r == 0)
861
+ {
862
+ std::swap(strset.at(leq), strset.at(llt));
863
+ std::swap(cache[leq], cache[llt]);
864
+ leq++;
865
+ }
866
+ else
867
+ {
868
+ max_lt = std::max(max_lt, cache[llt]);
869
+ }
870
+ ++llt;
871
+ }
872
+ while (llt <= rgt)
873
+ {
874
+ int r = cmp(cache[rgt], pivot);
875
+ if (r < 0)
876
+ {
877
+ max_lt = std::max(max_lt, cache[rgt]);
878
+ break;
879
+ }
880
+ if (r == 0)
881
+ {
882
+ std::swap(strset.at(req), strset.at(rgt));
883
+ std::swap(cache[req], cache[rgt]);
884
+ req--;
885
+ }
886
+ else
887
+ {
888
+ min_gt = std::min(min_gt, cache[rgt]);
889
+ }
890
+ --rgt;
891
+ }
892
+ if (llt > rgt)
893
+ break;
894
+ std::swap(strset.at(llt), strset.at(rgt));
895
+ std::swap(cache[llt], cache[rgt]);
896
+ ++llt;
897
+ --rgt;
898
+ }
899
+ // calculate size of areas = < and >, save into struct
900
+ size_t num_leq = leq, num_req = n - 1 - req;
901
+ num_eq_ = num_leq + num_req;
902
+ num_lt_ = llt - leq;
903
+ num_gt_ = req - rgt;
904
+ assert(num_eq_ > 0);
905
+ assert(num_lt_ + num_eq_ + num_gt_ == n);
906
+
907
+ // swap equal values from left to center
908
+ const size_t size1 = std::min(num_leq, num_lt_);
909
+ std::swap_ranges(strset.begin(), strset.begin() + size1,
910
+ strset.begin() + llt - size1);
911
+ std::swap_ranges(cache, cache + size1, cache + llt - size1);
912
+
913
+ // swap equal values from right to center
914
+ const size_t size2 = std::min(num_req, num_gt_);
915
+ std::swap_ranges(strset.begin() + llt, strset.begin() + llt + size2,
916
+ strset.begin() + n - size2);
917
+ std::swap_ranges(cache + llt, cache + llt + size2,
918
+ cache + n - size2);
919
+
920
+ // No recursive sorting if pivot has a zero byte
921
+ eq_recurse_ = (pivot & 0xFF);
922
+
923
+ // save LCP values for writing into LCP array after sorting further
924
+ if (strptr_.with_lcp && num_lt_ > 0)
925
+ {
926
+ assert(max_lt ==
927
+ *std::max_element(cache_ + 0, cache + num_lt_));
928
+
929
+ lcp_lt_ = lcpKeyType(max_lt, pivot);
930
+ // dchar_eq_ = getCharAtDepth(pivot, lcp_lt_);
931
+ TLX_LOGC(ctx.debug_lcp)
932
+ << "LCP lt with pivot: " << depth_ + lcp_lt_;
933
+ }
934
+
935
+ // calculate equal area lcp: +1 for the equal zero termination byte
936
+ lcp_eq_ = lcpKeyDepth(pivot);
937
+
938
+ if (strptr_.with_lcp && num_gt_ > 0)
939
+ {
940
+ assert(min_gt == *std::min_element(cache_ + num_lt_ + num_eq_,
941
+ cache_ + n));
942
+
943
+ lcp_gt_ = lcpKeyType(pivot, min_gt);
944
+ // dchar_gt_ = getCharAtDepth(min_gt, lcp_gt_);
945
+ TLX_LOGC(ctx.debug_lcp)
946
+ << "LCP pivot with gt: " << depth_ + lcp_gt_;
947
+ }
948
+
949
+ ++ctx.base_sort_steps;
950
+ }
951
+
952
+ void calculate_lcp()
953
+ {
954
+ if (strptr_.with_lcp && num_lt_ > 0)
955
+ {
956
+ strptr_.set_lcp(num_lt_, depth_ + lcp_lt_);
957
+ // strptr_.set_cache(num_lt_, dchar_eq_);
958
+ }
959
+
960
+ if (strptr_.with_lcp && num_gt_ > 0)
961
+ {
962
+ strptr_.set_lcp(num_lt_ + num_eq_, depth_ + lcp_gt_);
963
+ // strptr_.set_cache(num_lt_ + num_eq_, dchar_gt_);
964
+ }
965
+ }
966
+ };
967
+
968
+ size_t ms_front_ = 0;
969
+ std::vector<MKQSStep> ms_stack_;
970
+
971
+ void sort_mkqs_cache(const StringPtr& strptr, size_t depth)
972
+ {
973
+ assert(strcmp(mtimer_.running(), "mkqs") == 0);
974
+
975
+ if (!ctx_.enable_sequential_mkqs ||
976
+ strptr.size() < ctx_.inssort_threshold)
977
+ {
978
+ TLX_LOGC(ctx_.debug_jobs) << "insertion_sort() size "
979
+ << strptr.size() << " depth " << depth;
980
+
981
+ ScopedMultiTimerSwitch sts_inssort(mtimer_, "inssort");
982
+ insertion_sort(strptr.copy_back(), depth, /* memory */ 0);
983
+ ctx_.donesize(strptr.size());
984
+ return;
985
+ }
986
+
987
+ TLX_LOGC(ctx_.debug_jobs)
988
+ << "sort_mkqs_cache() size " << strptr.size() << " depth " << depth;
989
+
990
+ if (bktcache_.size() < strptr.size() * sizeof(key_type))
991
+ {
992
+ bktcache_.destroy();
993
+ bktcache_.resize(strptr.size() * sizeof(key_type));
994
+ }
995
+
996
+ // reuse bktcache as keycache
997
+ key_type* cache = reinterpret_cast<key_type*>(bktcache_.data());
998
+
999
+ assert(ms_front_ == 0);
1000
+ assert(ms_stack_.empty());
1001
+
1002
+ // std::deque is much slower than std::vector, so we use an artificial
1003
+ // pop_front variable.
1004
+ ms_stack_.emplace_back(ctx_, strptr, cache, depth, true);
1005
+
1006
+ while (ms_stack_.size() > ms_front_)
1007
+ {
1008
+ MKQSStep& ms = ms_stack_.back();
1009
+ ++ms.idx_; // increment here, because stack may change
1010
+
1011
+ // process the lt-subsequence
1012
+ if (ms.idx_ == 1)
1013
+ {
1014
+ if (ms.num_lt_ == 0)
1015
+ {
1016
+ // empty subsequence
1017
+ }
1018
+ else if (ms.num_lt_ < ctx_.inssort_threshold)
1019
+ {
1020
+ ScopedMultiTimerSwitch sts_inssort(mtimer_, "inssort");
1021
+ insertion_sort_cache<false>(ms.strptr_.sub(0, ms.num_lt_),
1022
+ ms.cache_, ms.depth_);
1023
+ ctx_.donesize(ms.num_lt_);
1024
+ }
1025
+ else
1026
+ {
1027
+ ms_stack_.emplace_back(ctx_, ms.strptr_.sub(0, ms.num_lt_),
1028
+ ms.cache_, ms.depth_, false);
1029
+ }
1030
+ }
1031
+ // process the eq-subsequence
1032
+ else if (ms.idx_ == 2)
1033
+ {
1034
+ StringPtr sp = ms.strptr_.sub(ms.num_lt_, ms.num_eq_);
1035
+
1036
+ assert(ms.num_eq_ > 0);
1037
+
1038
+ if (!ms.eq_recurse_)
1039
+ {
1040
+ StringPtr spb = sp.copy_back();
1041
+ spb.fill_lcp(ms.depth_ + ms.lcp_eq_);
1042
+ ctx_.donesize(spb.size());
1043
+ }
1044
+ else if (ms.num_eq_ < ctx_.inssort_threshold)
1045
+ {
1046
+ ScopedMultiTimerSwitch sts_inssort(mtimer_, "inssort");
1047
+ insertion_sort_cache<true>(sp, ms.cache_ + ms.num_lt_,
1048
+ ms.depth_ + sizeof(key_type));
1049
+ ctx_.donesize(ms.num_eq_);
1050
+ }
1051
+ else
1052
+ {
1053
+ ms_stack_.emplace_back(ctx_, sp, ms.cache_ + ms.num_lt_,
1054
+ ms.depth_ + sizeof(key_type), true);
1055
+ }
1056
+ }
1057
+ // process the gt-subsequence
1058
+ else if (ms.idx_ == 3)
1059
+ {
1060
+ StringPtr sp =
1061
+ ms.strptr_.sub(ms.num_lt_ + ms.num_eq_, ms.num_gt_);
1062
+
1063
+ if (ms.num_gt_ == 0)
1064
+ {
1065
+ // empty subsequence
1066
+ }
1067
+ else if (ms.num_gt_ < ctx_.inssort_threshold)
1068
+ {
1069
+ ScopedMultiTimerSwitch sts_inssort(mtimer_, "inssort");
1070
+ insertion_sort_cache<false>(
1071
+ sp, ms.cache_ + ms.num_lt_ + ms.num_eq_, ms.depth_);
1072
+ ctx_.donesize(ms.num_gt_);
1073
+ }
1074
+ else
1075
+ {
1076
+ ms_stack_.emplace_back(ctx_, sp,
1077
+ ms.cache_ + ms.num_lt_ + ms.num_eq_,
1078
+ ms.depth_, false);
1079
+ }
1080
+ }
1081
+ // calculate lcps
1082
+ else
1083
+ {
1084
+ // finished sort
1085
+ assert(ms_stack_.size() > ms_front_);
1086
+
1087
+ // calculate LCP after the three parts are sorted
1088
+ ms_stack_.back().calculate_lcp();
1089
+
1090
+ ms_stack_.pop_back();
1091
+ }
1092
+
1093
+ if (ctx_.enable_work_sharing && ctx_.threads_.has_idle())
1094
+ {
1095
+ sample_sort_free_work();
1096
+ }
1097
+ }
1098
+ }
1099
+
1100
+ void mkqs_free_work()
1101
+ {
1102
+ assert(ms_stack_.size() >= ms_front_);
1103
+
1104
+ for (unsigned int fl = 0; fl < 8; ++fl)
1105
+ {
1106
+ if (ms_stack_.size() == ms_front_)
1107
+ {
1108
+ return;
1109
+ }
1110
+
1111
+ TLX_LOGC(ctx_.debug_jobs)
1112
+ << "Freeing top level of PS5SmallsortJob's mkqs stack - size "
1113
+ << ms_stack_.size();
1114
+
1115
+ // convert top level of stack into independent jobs
1116
+
1117
+ MKQSStep& ms = ms_stack_[ms_front_];
1118
+
1119
+ if (ms.idx_ == 0 && ms.num_lt_ != 0)
1120
+ {
1121
+ this->substep_add();
1122
+ ctx_.enqueue(this, ms.strptr_.sub(0, ms.num_lt_), ms.depth_);
1123
+ }
1124
+ if (ms.idx_ <= 1) // st.num_eq > 0 always
1125
+ {
1126
+ assert(ms.num_eq_ > 0);
1127
+
1128
+ StringPtr sp = ms.strptr_.sub(ms.num_lt_, ms.num_eq_);
1129
+
1130
+ if (ms.eq_recurse_)
1131
+ {
1132
+ this->substep_add();
1133
+ ctx_.enqueue(this, sp, ms.depth_ + sizeof(key_type));
1134
+ }
1135
+ else
1136
+ {
1137
+ StringPtr spb = sp.copy_back();
1138
+ spb.fill_lcp(ms.depth_ + ms.lcp_eq_);
1139
+ ctx_.donesize(ms.num_eq_);
1140
+ }
1141
+ }
1142
+ if (ms.idx_ <= 2 && ms.num_gt_ != 0)
1143
+ {
1144
+ this->substep_add();
1145
+ ctx_.enqueue(
1146
+ this, ms.strptr_.sub(ms.num_lt_ + ms.num_eq_, ms.num_gt_),
1147
+ ms.depth_);
1148
+ }
1149
+
1150
+ // shorten the current stack
1151
+ ++ms_front_;
1152
+ }
1153
+ }
1154
+
1155
+ /*------------------------------------------------------------------------*/
1156
+ // Called When PS5SmallsortJob is Finished
1157
+
1158
+ void substep_all_done() final
1159
+ {
1160
+ TLX_LOGC(ctx_.debug_recursion)
1161
+ << "SmallSort[" << depth_ << "] "
1162
+ << "all substeps done -> LCP calculation";
1163
+
1164
+ while (ms_front_ > 0)
1165
+ {
1166
+ TLX_LOGC(ctx_.debug_lcp)
1167
+ << "SmallSort[" << depth_ << "] ms_front_: " << ms_front_;
1168
+ ms_stack_[--ms_front_].calculate_lcp();
1169
+ }
1170
+
1171
+ while (ss_front_ > 0)
1172
+ {
1173
+ TLX_LOGC(ctx_.debug_lcp)
1174
+ << "SmallSort[" << depth_ << "] ss_front_: " << ss_front_;
1175
+ ss_stack_[--ss_front_].calculate_lcp(ctx_);
1176
+ }
1177
+
1178
+ if (pstep_ != nullptr)
1179
+ pstep_->substep_notify_done();
1180
+ delete this;
1181
+ }
1182
+ };
1183
+
1184
+ /******************************************************************************/
1185
+ //! PS5BigSortStep Out-of-Place Parallel Sample Sort with Separate Jobs
1186
+
1187
+ template <typename Context, typename StringPtr>
1188
+ class PS5BigSortStep : public PS5SortStep
1189
+ {
1190
+ public:
1191
+ typedef typename StringPtr::StringSet StringSet;
1192
+ typedef typename StringSet::Iterator StrIterator;
1193
+ typedef typename Context::key_type key_type;
1194
+
1195
+ //! context
1196
+ Context& ctx_;
1197
+ //! parent sort step for notification
1198
+ PS5SortStep* pstep_;
1199
+
1200
+ //! string pointers, size, and current sorting depth
1201
+ StringPtr strptr_;
1202
+ size_t depth_;
1203
+
1204
+ //! number of parts into which the strings were split
1205
+ size_t parts_;
1206
+ //! size of all parts except the last
1207
+ size_t psize_;
1208
+ //! number of threads still working
1209
+ std::atomic<size_t> pwork_;
1210
+
1211
+ //! classifier instance and variables (contains splitter tree
1212
+ typename Context::Classify classifier_;
1213
+
1214
+ static const size_t treebits_ = Context::Classify::treebits;
1215
+ static const size_t num_splitters_ = Context::Classify::num_splitters;
1216
+ static const size_t bktnum_ = 2 * num_splitters_ + 1;
1217
+
1218
+ //! LCPs of splitters, needed for recursive calls
1219
+ unsigned char splitter_lcp_[num_splitters_ + 1];
1220
+
1221
+ //! individual bucket array of threads, keep bkt[0] for DistributeJob
1222
+ simple_vector<simple_vector<size_t> > bkt_;
1223
+ //! bucket ids cache, created by classifier and later counted
1224
+ simple_vector<simple_vector<std::uint16_t> > bktcache_;
1225
+
1226
+ /*------------------------------------------------------------------------*/
1227
+ // Constructor
1228
+
1229
+ PS5BigSortStep(Context& ctx, PS5SortStep* pstep, const StringPtr& strptr,
1230
+ size_t depth)
1231
+ : ctx_(ctx), pstep_(pstep), strptr_(strptr), depth_(depth)
1232
+ {
1233
+ // calculate number of parts
1234
+ // NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
1235
+ parts_ = strptr_.size() / ctx.sequential_threshold() * 2;
1236
+ if (parts_ == 0)
1237
+ parts_ = 1;
1238
+
1239
+ bkt_.resize(parts_);
1240
+ bktcache_.resize(parts_);
1241
+
1242
+ psize_ = (strptr.size() + parts_ - 1) / parts_;
1243
+
1244
+ TLX_LOGC(ctx_.debug_steps)
1245
+ << "enqueue depth=" << depth_ << " size=" << strptr_.size()
1246
+ << " parts=" << parts_ << " psize=" << psize_
1247
+ << " flip=" << strptr_.flipped();
1248
+
1249
+ ctx.threads_.enqueue([this]() { sample(); });
1250
+ ++ctx.para_ss_steps;
1251
+ }
1252
+
1253
+ virtual ~PS5BigSortStep()
1254
+ {
1255
+ }
1256
+
1257
+ /*------------------------------------------------------------------------*/
1258
+ // Sample Step
1259
+
1260
+ void sample()
1261
+ {
1262
+ ScopedMultiTimer smt(ctx_.mtimer, "para_ss");
1263
+ TLX_LOGC(ctx_.debug_jobs) << "Process SampleJob @ " << this;
1264
+
1265
+ const size_t oversample_factor = 2;
1266
+ size_t sample_size = oversample_factor * num_splitters_;
1267
+
1268
+ const StringSet& strset = strptr_.active();
1269
+ size_t n = strset.size();
1270
+
1271
+ simple_vector<key_type> samples(sample_size);
1272
+
1273
+ std::minstd_rand rng(reinterpret_cast<uintptr_t>(samples.data()));
1274
+
1275
+ for (size_t i = 0; i < sample_size; ++i)
1276
+ samples[i] = get_key_at<key_type>(strset, rng() % n, depth_);
1277
+
1278
+ std::sort(samples.begin(), samples.end());
1279
+
1280
+ classifier_.build(samples.data(), sample_size, splitter_lcp_);
1281
+
1282
+ // create new jobs
1283
+ pwork_ = parts_;
1284
+ for (unsigned int p = 0; p < parts_; ++p)
1285
+ {
1286
+ ctx_.threads_.enqueue([this, p]() { count(p); });
1287
+ }
1288
+ }
1289
+
1290
+ /*------------------------------------------------------------------------*/
1291
+ // Counting Step
1292
+
1293
+ void count(unsigned int p)
1294
+ {
1295
+ ScopedMultiTimer smt(ctx_.mtimer, "para_ss");
1296
+ TLX_LOGC(ctx_.debug_jobs) << "Process CountJob " << p << " @ " << this;
1297
+
1298
+ const StringSet& strset = strptr_.active();
1299
+
1300
+ StrIterator strB = strset.begin() + p * psize_;
1301
+ StrIterator strE =
1302
+ strset.begin() + std::min((p + 1) * psize_, strptr_.size());
1303
+ if (strE < strB)
1304
+ strE = strB;
1305
+
1306
+ bktcache_[p].resize(strE - strB);
1307
+ std::uint16_t* bktcache = bktcache_[p].data();
1308
+ classifier_.classify(strset, strB, strE, bktcache, depth_);
1309
+
1310
+ bkt_[p].resize(bktnum_ + (p == 0 ? 1 : 0));
1311
+ size_t* bkt = bkt_[p].data();
1312
+ memset(bkt, 0, bktnum_ * sizeof(size_t));
1313
+
1314
+ for (std::uint16_t* bc = bktcache; bc != bktcache + (strE - strB); ++bc)
1315
+ ++bkt[*bc];
1316
+
1317
+ if (--pwork_ == 0)
1318
+ count_finished();
1319
+ }
1320
+
1321
+ void count_finished()
1322
+ {
1323
+ ScopedMultiTimer smt(ctx_.mtimer, "para_ss");
1324
+ TLX_LOGC(ctx_.debug_jobs)
1325
+ << "Finishing CountJob " << this << " with prefixsum";
1326
+
1327
+ // abort sorting if we're measuring only the top level
1328
+ if (ctx_.use_only_first_sortstep)
1329
+ return;
1330
+
1331
+ // inclusive prefix sum over bkt
1332
+ size_t sum = 0;
1333
+ for (unsigned int i = 0; i < bktnum_; ++i)
1334
+ {
1335
+ for (unsigned int p = 0; p < parts_; ++p)
1336
+ {
1337
+ bkt_[p][i] = (sum += bkt_[p][i]);
1338
+ }
1339
+ }
1340
+ assert(sum == strptr_.size());
1341
+
1342
+ // create new jobs
1343
+ pwork_ = parts_;
1344
+ for (unsigned int p = 0; p < parts_; ++p)
1345
+ {
1346
+ ctx_.threads_.enqueue([this, p]() { distribute(p); });
1347
+ }
1348
+ }
1349
+
1350
+ /*------------------------------------------------------------------------*/
1351
+ // Distribute Step
1352
+
1353
+ void distribute(unsigned int p)
1354
+ {
1355
+ ScopedMultiTimer smt(ctx_.mtimer, "para_ss");
1356
+ TLX_LOGC(ctx_.debug_jobs)
1357
+ << "Process DistributeJob " << p << " @ " << this;
1358
+
1359
+ const StringSet& strset = strptr_.active();
1360
+
1361
+ StrIterator strB = strset.begin() + p * psize_;
1362
+ StrIterator strE =
1363
+ strset.begin() + std::min((p + 1) * psize_, strptr_.size());
1364
+ if (strE < strB)
1365
+ strE = strB;
1366
+
1367
+ // get alternative shadow pointer array
1368
+ const StringSet& sorted = strptr_.shadow();
1369
+ typename StringSet::Iterator sbegin = sorted.begin();
1370
+
1371
+ std::uint16_t* bktcache = bktcache_[p].data();
1372
+ size_t* bkt = bkt_[p].data();
1373
+
1374
+ for (StrIterator str = strB; str != strE; ++str, ++bktcache)
1375
+ *(sbegin + --bkt[*bktcache]) = std::move(*str);
1376
+
1377
+ if (p != 0) // p = 0 is needed for recursion into bkts
1378
+ bkt_[p].destroy();
1379
+
1380
+ bktcache_[p].destroy();
1381
+
1382
+ if (--pwork_ == 0)
1383
+ distribute_finished();
1384
+ }
1385
+
1386
+ void distribute_finished()
1387
+ {
1388
+ TLX_LOGC(ctx_.debug_jobs)
1389
+ << "Finishing DistributeJob " << this << " with enqueuing subjobs";
1390
+
1391
+ size_t* bkt = bkt_[0].data();
1392
+ assert(bkt);
1393
+
1394
+ // first processor's bkt pointers are boundaries between bkts, just add
1395
+ // sentinel:
1396
+ assert(bkt[0] == 0);
1397
+ bkt[bktnum_] = strptr_.size();
1398
+
1399
+ // keep anonymous subjob handle while creating subjobs
1400
+ this->substep_add();
1401
+
1402
+ size_t i = 0;
1403
+ while (i < bktnum_ - 1)
1404
+ {
1405
+ // i is even -> bkt[i] is less-than bucket
1406
+ size_t bktsize = bkt[i + 1] - bkt[i];
1407
+ if (bktsize == 0)
1408
+ {
1409
+ // empty bucket
1410
+ }
1411
+ else if (bktsize == 1)
1412
+ { // just one string pointer, copyback
1413
+ strptr_.flip(bkt[i], 1).copy_back();
1414
+ ctx_.donesize(1);
1415
+ }
1416
+ else
1417
+ {
1418
+ TLX_LOGC(ctx_.debug_recursion)
1419
+ << "Recurse[" << depth_ << "]: < bkt " << bkt[i] << " size "
1420
+ << bktsize << " lcp " << int(splitter_lcp_[i / 2] & 0x7F);
1421
+ this->substep_add();
1422
+ ctx_.enqueue(this, strptr_.flip(bkt[i], bktsize),
1423
+ depth_ + (splitter_lcp_[i / 2] & 0x7F));
1424
+ }
1425
+ ++i;
1426
+ // i is odd -> bkt[i] is equal bucket
1427
+ bktsize = bkt[i + 1] - bkt[i];
1428
+ if (bktsize == 0)
1429
+ {
1430
+ // empty bucket
1431
+ }
1432
+ else if (bktsize == 1)
1433
+ { // just one string pointer, copyback
1434
+ strptr_.flip(bkt[i], 1).copy_back();
1435
+ ctx_.donesize(1);
1436
+ }
1437
+ else
1438
+ {
1439
+ if (splitter_lcp_[i / 2] & 0x80)
1440
+ {
1441
+ // equal-bucket has nullptr-terminated key, done.
1442
+ TLX_LOGC(ctx_.debug_recursion)
1443
+ << "Recurse[" << depth_ << "]: = bkt " << bkt[i]
1444
+ << " size " << bktsize << " is done!";
1445
+ StringPtr sp = strptr_.flip(bkt[i], bktsize).copy_back();
1446
+ sp.fill_lcp(depth_ +
1447
+ lcpKeyDepth(classifier_.get_splitter(i / 2)));
1448
+ ctx_.donesize(bktsize);
1449
+ }
1450
+ else
1451
+ {
1452
+ TLX_LOGC(ctx_.debug_recursion)
1453
+ << "Recurse[" << depth_ << "]: = bkt " << bkt[i]
1454
+ << " size " << bktsize << " lcp keydepth!";
1455
+ this->substep_add();
1456
+ ctx_.enqueue(this, strptr_.flip(bkt[i], bktsize),
1457
+ depth_ + sizeof(key_type));
1458
+ }
1459
+ }
1460
+ ++i;
1461
+ }
1462
+
1463
+ size_t bktsize = bkt[i + 1] - bkt[i];
1464
+
1465
+ if (bktsize == 0)
1466
+ {
1467
+ // empty bucket
1468
+ }
1469
+ else if (bktsize == 1)
1470
+ { // just one string pointer, copyback
1471
+ strptr_.flip(bkt[i], 1).copy_back();
1472
+ ctx_.donesize(1);
1473
+ }
1474
+ else
1475
+ {
1476
+ TLX_LOGC(ctx_.debug_recursion)
1477
+ << "Recurse[" << depth_ << "]: > bkt " << bkt[i] << " size "
1478
+ << bktsize << " no lcp";
1479
+ this->substep_add();
1480
+ ctx_.enqueue(this, strptr_.flip(bkt[i], bktsize), depth_);
1481
+ }
1482
+
1483
+ this->substep_notify_done(); // release anonymous subjob handle
1484
+
1485
+ if (!strptr_.with_lcp)
1486
+ bkt_[0].destroy();
1487
+ }
1488
+
1489
+ /*------------------------------------------------------------------------*/
1490
+ // After Recursive Sorting
1491
+
1492
+ void substep_all_done() final
1493
+ {
1494
+ ScopedMultiTimer smt(ctx_.mtimer, "para_ss");
1495
+ if (strptr_.with_lcp)
1496
+ {
1497
+ TLX_LOGC(ctx_.debug_steps)
1498
+ << "pSampleSortStep[" << depth_ << "]: all substeps done.";
1499
+
1500
+ ps5_sample_sort_lcp<bktnum_>(ctx_, classifier_, strptr_, depth_,
1501
+ bkt_[0].data());
1502
+ bkt_[0].destroy();
1503
+ }
1504
+
1505
+ if (pstep_ != nullptr)
1506
+ pstep_->substep_notify_done();
1507
+ delete this;
1508
+ }
1509
+ };
1510
+
1511
+ /******************************************************************************/
1512
+ // PS5Context::enqueue()
1513
+
1514
+ template <typename Parameters>
1515
+ template <typename StringPtr>
1516
+ void PS5Context<Parameters>::enqueue(PS5SortStep* pstep,
1517
+ const StringPtr& strptr, size_t depth)
1518
+ {
1519
+ if (this->enable_parallel_sample_sort &&
1520
+ (strptr.size() > sequential_threshold() ||
1521
+ this->use_only_first_sortstep))
1522
+ {
1523
+ new PS5BigSortStep<PS5Context, StringPtr>(*this, pstep, strptr, depth);
1524
+ }
1525
+ else
1526
+ {
1527
+ if (strptr.size() < (1LLU << 32))
1528
+ {
1529
+ auto j = new PS5SmallsortJob<PS5Context, StringPtr, std::uint32_t>(
1530
+ *this, pstep, strptr, depth);
1531
+ threads_.enqueue([j]() { j->run(); });
1532
+ }
1533
+ else
1534
+ {
1535
+ auto j = new PS5SmallsortJob<PS5Context, StringPtr, std::uint64_t>(
1536
+ *this, pstep, strptr, depth);
1537
+ threads_.enqueue([j]() { j->run(); });
1538
+ }
1539
+ }
1540
+ }
1541
+
1542
+ /******************************************************************************/
1543
+ // Externally Callable Sorting Methods
1544
+
1545
+ //! Main Parallel Sample Sort Function. See below for more convenient wrappers.
1546
+ template <typename PS5Parameters, typename StringPtr>
1547
+ void parallel_sample_sort_base(const StringPtr& strptr, size_t depth)
1548
+ {
1549
+ using Context = PS5Context<PS5Parameters>;
1550
+ Context ctx(std::thread::hardware_concurrency());
1551
+ ctx.total_size = strptr.size();
1552
+ ctx.rest_size = strptr.size();
1553
+ ctx.num_threads = ctx.threads_.size();
1554
+
1555
+ MultiTimer timer;
1556
+ timer.start("sort");
1557
+
1558
+ ctx.enqueue(/* pstep */ nullptr, strptr, depth);
1559
+ ctx.threads_.loop_until_empty();
1560
+
1561
+ timer.stop();
1562
+
1563
+ assert(!ctx.enable_rest_size || ctx.rest_size == 0);
1564
+
1565
+ using BigSortStep = PS5BigSortStep<Context, StringPtr>;
1566
+
1567
+ TLX_LOGC(ctx.debug_result)
1568
+ << "RESULT"
1569
+ << " sizeof(key_type)=" << sizeof(typename PS5Parameters::key_type)
1570
+ << " splitter_treebits=" << size_t(BigSortStep::treebits_)
1571
+ << " num_splitters=" << size_t(BigSortStep::num_splitters_)
1572
+ << " num_threads=" << ctx.num_threads
1573
+ << " enable_work_sharing=" << size_t(ctx.enable_work_sharing)
1574
+ << " use_restsize=" << size_t(ctx.enable_rest_size)
1575
+ << " tm_para_ss=" << ctx.mtimer.get("para_ss")
1576
+ << " tm_seq_ss=" << ctx.mtimer.get("sequ_ss")
1577
+ << " tm_mkqs=" << ctx.mtimer.get("mkqs")
1578
+ << " tm_inssort=" << ctx.mtimer.get("inssort")
1579
+ << " tm_total=" << ctx.mtimer.total()
1580
+ << " tm_idle=" << (ctx.num_threads * timer.total()) - ctx.mtimer.total()
1581
+ << " steps_para_sample_sort=" << ctx.para_ss_steps
1582
+ << " steps_seq_sample_sort=" << ctx.sequ_ss_steps
1583
+ << " steps_base_sort=" << ctx.base_sort_steps;
1584
+ }
1585
+
1586
+ //! Parallel Sample Sort Function for a generic StringSet, this allocates the
1587
+ //! shadow array for flipping.
1588
+ template <typename PS5Parameters, typename StringPtr>
1589
+ typename enable_if<!StringPtr::with_lcp, void>::type
1590
+ parallel_sample_sort_params(const StringPtr& strptr, size_t depth,
1591
+ size_t memory = 0)
1592
+ {
1593
+ tlx::unused(memory);
1594
+
1595
+ typedef typename StringPtr::StringSet StringSet;
1596
+ const StringSet& strset = strptr.active();
1597
+
1598
+ typedef StringShadowPtr<StringSet> StringShadowPtr;
1599
+ typedef typename StringSet::Container Container;
1600
+
1601
+ // allocate shadow pointer array
1602
+ Container shadow = strset.allocate(strset.size());
1603
+ StringShadowPtr new_strptr(strset, StringSet(shadow));
1604
+
1605
+ parallel_sample_sort_base<PS5Parameters>(new_strptr, depth);
1606
+
1607
+ StringSet::deallocate(shadow);
1608
+ }
1609
+
1610
+ //! Parallel Sample Sort Function for a generic StringSet with LCPs, this
1611
+ //! allocates the shadow array for flipping.
1612
+ template <typename PS5Parameters, typename StringPtr>
1613
+ typename enable_if<StringPtr::with_lcp, void>::type parallel_sample_sort_params(
1614
+ const StringPtr& strptr, size_t depth, size_t memory = 0)
1615
+ {
1616
+ tlx::unused(memory);
1617
+
1618
+ typedef typename StringPtr::StringSet StringSet;
1619
+ typedef typename StringPtr::LcpType LcpType;
1620
+ const StringSet& strset = strptr.active();
1621
+
1622
+ typedef StringShadowLcpPtr<StringSet, LcpType> StringShadowLcpPtr;
1623
+ typedef typename StringSet::Container Container;
1624
+
1625
+ // allocate shadow pointer array
1626
+ Container shadow = strset.allocate(strset.size());
1627
+ StringShadowLcpPtr new_strptr(strset, StringSet(shadow), strptr.lcp());
1628
+
1629
+ parallel_sample_sort_base<PS5Parameters>(new_strptr, depth);
1630
+
1631
+ StringSet::deallocate(shadow);
1632
+ }
1633
+
1634
+ //! Parallel Sample Sort Function with default parameter size for a generic
1635
+ //! StringSet.
1636
+ template <typename StringPtr>
1637
+ void parallel_sample_sort(const StringPtr& strptr, size_t depth, size_t memory)
1638
+ {
1639
+ return parallel_sample_sort_params<PS5ParametersDefault>(strptr, depth,
1640
+ memory);
1641
+ }
1642
+
1643
+ }} // namespace tlx::sort_strings_detail
1644
+
1645
+ #endif // !TLX_SORT_STRINGS_PARALLEL_SAMPLE_SORT_HEADER
1646
+
1647
+ /******************************************************************************/