@ladybugmem/icebug 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/binding.gyp +32 -10
  2. package/lib/index.js +23 -11
  3. package/package.json +9 -15
  4. package/prebuilds/darwin-arm64/icebug.node +0 -0
  5. package/{vendor/lib → prebuilds/darwin-arm64}/libnetworkit.dylib +0 -0
  6. package/prebuilds/linux-x64/icebug.node +0 -0
  7. package/prebuilds/linux-x64/libnetworkit.so +0 -0
  8. package/scripts/download-icebug.sh +92 -0
  9. package/build/Release/.deps/Release/icebug.node.d +0 -1
  10. package/build/Release/.deps/Release/obj.target/icebug/src/addon.o.d +0 -291
  11. package/build/Release/icebug.node +0 -0
  12. package/build/Release/obj.target/icebug/src/addon.o +0 -0
  13. package/vendor/include/networkit/GlobalState.hpp +0 -86
  14. package/vendor/include/networkit/Globals.hpp +0 -41
  15. package/vendor/include/networkit/algebraic/AlgebraicGlobals.hpp +0 -27
  16. package/vendor/include/networkit/algebraic/CSRGeneralMatrix.hpp +0 -1292
  17. package/vendor/include/networkit/algebraic/CSRMatrix.hpp +0 -11
  18. package/vendor/include/networkit/algebraic/DenseMatrix.hpp +0 -537
  19. package/vendor/include/networkit/algebraic/DynamicMatrix.hpp +0 -514
  20. package/vendor/include/networkit/algebraic/GraphBLAS.hpp +0 -323
  21. package/vendor/include/networkit/algebraic/MatrixTools.hpp +0 -156
  22. package/vendor/include/networkit/algebraic/Semirings.hpp +0 -171
  23. package/vendor/include/networkit/algebraic/SparseAccumulator.hpp +0 -111
  24. package/vendor/include/networkit/algebraic/Vector.hpp +0 -371
  25. package/vendor/include/networkit/algebraic/algorithms/AlgebraicBFS.hpp +0 -72
  26. package/vendor/include/networkit/algebraic/algorithms/AlgebraicBellmanFord.hpp +0 -88
  27. package/vendor/include/networkit/algebraic/algorithms/AlgebraicMatchingCoarsening.hpp +0 -96
  28. package/vendor/include/networkit/algebraic/algorithms/AlgebraicPageRank.hpp +0 -145
  29. package/vendor/include/networkit/algebraic/algorithms/AlgebraicSpanningEdgeCentrality.hpp +0 -122
  30. package/vendor/include/networkit/algebraic/algorithms/AlgebraicTriangleCounting.hpp +0 -76
  31. package/vendor/include/networkit/auxiliary/AlignedAllocator.hpp +0 -113
  32. package/vendor/include/networkit/auxiliary/ArrayTools.hpp +0 -85
  33. package/vendor/include/networkit/auxiliary/BloomFilter.hpp +0 -70
  34. package/vendor/include/networkit/auxiliary/BucketPQ.hpp +0 -142
  35. package/vendor/include/networkit/auxiliary/Enforce.hpp +0 -117
  36. package/vendor/include/networkit/auxiliary/FunctionTraits.hpp +0 -74
  37. package/vendor/include/networkit/auxiliary/HashUtils.hpp +0 -28
  38. package/vendor/include/networkit/auxiliary/IncrementalUniformRandomSelector.hpp +0 -52
  39. package/vendor/include/networkit/auxiliary/Log.hpp +0 -119
  40. package/vendor/include/networkit/auxiliary/MissingMath.hpp +0 -48
  41. package/vendor/include/networkit/auxiliary/Multiprecision.hpp +0 -17
  42. package/vendor/include/networkit/auxiliary/NumberParsing.hpp +0 -307
  43. package/vendor/include/networkit/auxiliary/NumericTools.hpp +0 -57
  44. package/vendor/include/networkit/auxiliary/Parallel.hpp +0 -56
  45. package/vendor/include/networkit/auxiliary/Parallelism.hpp +0 -33
  46. package/vendor/include/networkit/auxiliary/PrioQueue.hpp +0 -252
  47. package/vendor/include/networkit/auxiliary/Random.hpp +0 -122
  48. package/vendor/include/networkit/auxiliary/SetIntersector.hpp +0 -72
  49. package/vendor/include/networkit/auxiliary/SignalHandling.hpp +0 -39
  50. package/vendor/include/networkit/auxiliary/SortedList.hpp +0 -128
  51. package/vendor/include/networkit/auxiliary/SparseVector.hpp +0 -215
  52. package/vendor/include/networkit/auxiliary/SpinLock.hpp +0 -23
  53. package/vendor/include/networkit/auxiliary/StringBuilder.hpp +0 -322
  54. package/vendor/include/networkit/auxiliary/StringTools.hpp +0 -76
  55. package/vendor/include/networkit/auxiliary/TemplateUtils.hpp +0 -76
  56. package/vendor/include/networkit/auxiliary/Timer.hpp +0 -145
  57. package/vendor/include/networkit/auxiliary/VectorComparator.hpp +0 -32
  58. package/vendor/include/networkit/base/Algorithm.hpp +0 -41
  59. package/vendor/include/networkit/base/DynAlgorithm.hpp +0 -31
  60. package/vendor/include/networkit/centrality/ApproxBetweenness.hpp +0 -62
  61. package/vendor/include/networkit/centrality/ApproxCloseness.hpp +0 -136
  62. package/vendor/include/networkit/centrality/ApproxElectricalCloseness.hpp +0 -156
  63. package/vendor/include/networkit/centrality/ApproxGroupBetweenness.hpp +0 -124
  64. package/vendor/include/networkit/centrality/ApproxSpanningEdge.hpp +0 -84
  65. package/vendor/include/networkit/centrality/Betweenness.hpp +0 -47
  66. package/vendor/include/networkit/centrality/Centrality.hpp +0 -98
  67. package/vendor/include/networkit/centrality/Closeness.hpp +0 -107
  68. package/vendor/include/networkit/centrality/ComplexPaths.hpp +0 -113
  69. package/vendor/include/networkit/centrality/CoreDecomposition.hpp +0 -161
  70. package/vendor/include/networkit/centrality/DegreeCentrality.hpp +0 -55
  71. package/vendor/include/networkit/centrality/DynApproxBetweenness.hpp +0 -95
  72. package/vendor/include/networkit/centrality/DynBetweenness.hpp +0 -99
  73. package/vendor/include/networkit/centrality/DynBetweennessOneNode.hpp +0 -98
  74. package/vendor/include/networkit/centrality/DynKatzCentrality.hpp +0 -115
  75. package/vendor/include/networkit/centrality/DynTopHarmonicCloseness.hpp +0 -223
  76. package/vendor/include/networkit/centrality/EigenvectorCentrality.hpp +0 -41
  77. package/vendor/include/networkit/centrality/EstimateBetweenness.hpp +0 -51
  78. package/vendor/include/networkit/centrality/ForestCentrality.hpp +0 -112
  79. package/vendor/include/networkit/centrality/GedWalk.hpp +0 -225
  80. package/vendor/include/networkit/centrality/GroupCloseness.hpp +0 -115
  81. package/vendor/include/networkit/centrality/GroupClosenessGrowShrink.hpp +0 -78
  82. package/vendor/include/networkit/centrality/GroupClosenessLocalSearch.hpp +0 -77
  83. package/vendor/include/networkit/centrality/GroupClosenessLocalSwaps.hpp +0 -106
  84. package/vendor/include/networkit/centrality/GroupDegree.hpp +0 -155
  85. package/vendor/include/networkit/centrality/GroupHarmonicCloseness.hpp +0 -83
  86. package/vendor/include/networkit/centrality/HarmonicCloseness.hpp +0 -48
  87. package/vendor/include/networkit/centrality/KPathCentrality.hpp +0 -52
  88. package/vendor/include/networkit/centrality/KadabraBetweenness.hpp +0 -242
  89. package/vendor/include/networkit/centrality/KatzCentrality.hpp +0 -62
  90. package/vendor/include/networkit/centrality/LaplacianCentrality.hpp +0 -44
  91. package/vendor/include/networkit/centrality/LocalClusteringCoefficient.hpp +0 -60
  92. package/vendor/include/networkit/centrality/LocalPartitionCoverage.hpp +0 -43
  93. package/vendor/include/networkit/centrality/LocalSquareClusteringCoefficient.hpp +0 -42
  94. package/vendor/include/networkit/centrality/PageRank.hpp +0 -101
  95. package/vendor/include/networkit/centrality/PermanenceCentrality.hpp +0 -48
  96. package/vendor/include/networkit/centrality/Sfigality.hpp +0 -45
  97. package/vendor/include/networkit/centrality/SpanningEdgeCentrality.hpp +0 -86
  98. package/vendor/include/networkit/centrality/TopCloseness.hpp +0 -136
  99. package/vendor/include/networkit/centrality/TopHarmonicCloseness.hpp +0 -151
  100. package/vendor/include/networkit/clique/MaximalCliques.hpp +0 -83
  101. package/vendor/include/networkit/coarsening/ClusteringProjector.hpp +0 -59
  102. package/vendor/include/networkit/coarsening/CoarsenedGraphView.hpp +0 -156
  103. package/vendor/include/networkit/coarsening/GraphCoarsening.hpp +0 -57
  104. package/vendor/include/networkit/coarsening/MatchingCoarsening.hpp +0 -43
  105. package/vendor/include/networkit/coarsening/ParallelPartitionCoarsening.hpp +0 -33
  106. package/vendor/include/networkit/coarsening/ParallelPartitionCoarseningView.hpp +0 -62
  107. package/vendor/include/networkit/community/AdjustedRandMeasure.hpp +0 -31
  108. package/vendor/include/networkit/community/ClusteringGenerator.hpp +0 -75
  109. package/vendor/include/networkit/community/CommunityDetectionAlgorithm.hpp +0 -58
  110. package/vendor/include/networkit/community/Conductance.hpp +0 -32
  111. package/vendor/include/networkit/community/CoverF1Similarity.hpp +0 -53
  112. package/vendor/include/networkit/community/CoverHubDominance.hpp +0 -38
  113. package/vendor/include/networkit/community/Coverage.hpp +0 -25
  114. package/vendor/include/networkit/community/CutClustering.hpp +0 -62
  115. package/vendor/include/networkit/community/DissimilarityMeasure.hpp +0 -31
  116. package/vendor/include/networkit/community/DynamicNMIDistance.hpp +0 -44
  117. package/vendor/include/networkit/community/EdgeCut.hpp +0 -24
  118. package/vendor/include/networkit/community/GraphClusteringTools.hpp +0 -103
  119. package/vendor/include/networkit/community/GraphStructuralRandMeasure.hpp +0 -28
  120. package/vendor/include/networkit/community/HubDominance.hpp +0 -46
  121. package/vendor/include/networkit/community/IntrapartitionDensity.hpp +0 -44
  122. package/vendor/include/networkit/community/IsolatedInterpartitionConductance.hpp +0 -40
  123. package/vendor/include/networkit/community/IsolatedInterpartitionExpansion.hpp +0 -40
  124. package/vendor/include/networkit/community/JaccardMeasure.hpp +0 -25
  125. package/vendor/include/networkit/community/LFM.hpp +0 -49
  126. package/vendor/include/networkit/community/LPDegreeOrdered.hpp +0 -48
  127. package/vendor/include/networkit/community/LocalCommunityEvaluation.hpp +0 -100
  128. package/vendor/include/networkit/community/LocalCoverEvaluation.hpp +0 -31
  129. package/vendor/include/networkit/community/LocalPartitionEvaluation.hpp +0 -31
  130. package/vendor/include/networkit/community/LouvainMapEquation.hpp +0 -135
  131. package/vendor/include/networkit/community/Modularity.hpp +0 -54
  132. package/vendor/include/networkit/community/NMIDistance.hpp +0 -28
  133. package/vendor/include/networkit/community/NodeStructuralRandMeasure.hpp +0 -27
  134. package/vendor/include/networkit/community/OverlappingCommunityDetectionAlgorithm.hpp +0 -51
  135. package/vendor/include/networkit/community/OverlappingNMIDistance.hpp +0 -175
  136. package/vendor/include/networkit/community/PLM.hpp +0 -89
  137. package/vendor/include/networkit/community/PLP.hpp +0 -83
  138. package/vendor/include/networkit/community/ParallelAgglomerativeClusterer.hpp +0 -37
  139. package/vendor/include/networkit/community/ParallelLeiden.hpp +0 -96
  140. package/vendor/include/networkit/community/ParallelLeidenView.hpp +0 -138
  141. package/vendor/include/networkit/community/PartitionFragmentation.hpp +0 -30
  142. package/vendor/include/networkit/community/PartitionHubDominance.hpp +0 -37
  143. package/vendor/include/networkit/community/PartitionIntersection.hpp +0 -25
  144. package/vendor/include/networkit/community/QualityMeasure.hpp +0 -27
  145. package/vendor/include/networkit/community/SampledGraphStructuralRandMeasure.hpp +0 -40
  146. package/vendor/include/networkit/community/SampledNodeStructuralRandMeasure.hpp +0 -40
  147. package/vendor/include/networkit/community/StablePartitionNodes.hpp +0 -48
  148. package/vendor/include/networkit/components/BiconnectedComponents.hpp +0 -116
  149. package/vendor/include/networkit/components/ComponentDecomposition.hpp +0 -72
  150. package/vendor/include/networkit/components/ConnectedComponents.hpp +0 -55
  151. package/vendor/include/networkit/components/DynConnectedComponents.hpp +0 -71
  152. package/vendor/include/networkit/components/DynWeaklyConnectedComponents.hpp +0 -73
  153. package/vendor/include/networkit/components/ParallelConnectedComponents.hpp +0 -44
  154. package/vendor/include/networkit/components/RandomSpanningForest.hpp +0 -36
  155. package/vendor/include/networkit/components/StronglyConnectedComponents.hpp +0 -50
  156. package/vendor/include/networkit/components/WeaklyConnectedComponents.hpp +0 -59
  157. package/vendor/include/networkit/correlation/Assortativity.hpp +0 -64
  158. package/vendor/include/networkit/distance/APSP.hpp +0 -70
  159. package/vendor/include/networkit/distance/AStar.hpp +0 -68
  160. package/vendor/include/networkit/distance/AStarGeneral.hpp +0 -110
  161. package/vendor/include/networkit/distance/AdamicAdarDistance.hpp +0 -52
  162. package/vendor/include/networkit/distance/AffectedNodes.hpp +0 -130
  163. package/vendor/include/networkit/distance/AlgebraicDistance.hpp +0 -63
  164. package/vendor/include/networkit/distance/BFS.hpp +0 -43
  165. package/vendor/include/networkit/distance/BidirectionalBFS.hpp +0 -51
  166. package/vendor/include/networkit/distance/BidirectionalDijkstra.hpp +0 -69
  167. package/vendor/include/networkit/distance/CommuteTimeDistance.hpp +0 -89
  168. package/vendor/include/networkit/distance/Diameter.hpp +0 -97
  169. package/vendor/include/networkit/distance/Dijkstra.hpp +0 -50
  170. package/vendor/include/networkit/distance/DynAPSP.hpp +0 -67
  171. package/vendor/include/networkit/distance/DynBFS.hpp +0 -56
  172. package/vendor/include/networkit/distance/DynDijkstra.hpp +0 -57
  173. package/vendor/include/networkit/distance/DynPrunedLandmarkLabeling.hpp +0 -67
  174. package/vendor/include/networkit/distance/DynSSSP.hpp +0 -87
  175. package/vendor/include/networkit/distance/Eccentricity.hpp +0 -32
  176. package/vendor/include/networkit/distance/EffectiveDiameter.hpp +0 -47
  177. package/vendor/include/networkit/distance/EffectiveDiameterApproximation.hpp +0 -57
  178. package/vendor/include/networkit/distance/FloydWarshall.hpp +0 -93
  179. package/vendor/include/networkit/distance/GraphDistance.hpp +0 -49
  180. package/vendor/include/networkit/distance/HopPlotApproximation.hpp +0 -62
  181. package/vendor/include/networkit/distance/IncompleteDijkstra.hpp +0 -66
  182. package/vendor/include/networkit/distance/IncompleteSSSP.hpp +0 -41
  183. package/vendor/include/networkit/distance/JaccardDistance.hpp +0 -57
  184. package/vendor/include/networkit/distance/MultiTargetBFS.hpp +0 -32
  185. package/vendor/include/networkit/distance/MultiTargetDijkstra.hpp +0 -40
  186. package/vendor/include/networkit/distance/NeighborhoodFunction.hpp +0 -47
  187. package/vendor/include/networkit/distance/NeighborhoodFunctionApproximation.hpp +0 -56
  188. package/vendor/include/networkit/distance/NeighborhoodFunctionHeuristic.hpp +0 -56
  189. package/vendor/include/networkit/distance/NodeDistance.hpp +0 -54
  190. package/vendor/include/networkit/distance/PrunedLandmarkLabeling.hpp +0 -76
  191. package/vendor/include/networkit/distance/ReverseBFS.hpp +0 -46
  192. package/vendor/include/networkit/distance/SPSP.hpp +0 -143
  193. package/vendor/include/networkit/distance/SSSP.hpp +0 -216
  194. package/vendor/include/networkit/distance/STSP.hpp +0 -193
  195. package/vendor/include/networkit/distance/Volume.hpp +0 -66
  196. package/vendor/include/networkit/dynamics/DGSStreamParser.hpp +0 -40
  197. package/vendor/include/networkit/dynamics/DGSWriter.hpp +0 -30
  198. package/vendor/include/networkit/dynamics/GraphDifference.hpp +0 -110
  199. package/vendor/include/networkit/dynamics/GraphEvent.hpp +0 -55
  200. package/vendor/include/networkit/dynamics/GraphEventHandler.hpp +0 -39
  201. package/vendor/include/networkit/dynamics/GraphEventProxy.hpp +0 -55
  202. package/vendor/include/networkit/dynamics/GraphUpdater.hpp +0 -38
  203. package/vendor/include/networkit/edgescores/ChibaNishizekiQuadrangleEdgeScore.hpp +0 -26
  204. package/vendor/include/networkit/edgescores/ChibaNishizekiTriangleEdgeScore.hpp +0 -33
  205. package/vendor/include/networkit/edgescores/EdgeScore.hpp +0 -50
  206. package/vendor/include/networkit/edgescores/EdgeScoreAsWeight.hpp +0 -33
  207. package/vendor/include/networkit/edgescores/EdgeScoreBlender.hpp +0 -33
  208. package/vendor/include/networkit/edgescores/EdgeScoreLinearizer.hpp +0 -32
  209. package/vendor/include/networkit/edgescores/EdgeScoreNormalizer.hpp +0 -35
  210. package/vendor/include/networkit/edgescores/GeometricMeanScore.hpp +0 -29
  211. package/vendor/include/networkit/edgescores/PrefixJaccardScore.hpp +0 -23
  212. package/vendor/include/networkit/edgescores/TriangleEdgeScore.hpp +0 -39
  213. package/vendor/include/networkit/embedding/Node2Vec.hpp +0 -83
  214. package/vendor/include/networkit/flow/EdmondsKarp.hpp +0 -112
  215. package/vendor/include/networkit/generators/BarabasiAlbertGenerator.hpp +0 -87
  216. package/vendor/include/networkit/generators/ChungLuGenerator.hpp +0 -46
  217. package/vendor/include/networkit/generators/ChungLuGeneratorAlamEtAl.hpp +0 -63
  218. package/vendor/include/networkit/generators/ClusteredRandomGraphGenerator.hpp +0 -56
  219. package/vendor/include/networkit/generators/ConfigurationModel.hpp +0 -36
  220. package/vendor/include/networkit/generators/DorogovtsevMendesGenerator.hpp +0 -33
  221. package/vendor/include/networkit/generators/DynamicBarabasiAlbertGenerator.hpp +0 -33
  222. package/vendor/include/networkit/generators/DynamicDGSParser.hpp +0 -51
  223. package/vendor/include/networkit/generators/DynamicDorogovtsevMendesGenerator.hpp +0 -34
  224. package/vendor/include/networkit/generators/DynamicForestFireGenerator.hpp +0 -55
  225. package/vendor/include/networkit/generators/DynamicGraphGenerator.hpp +0 -40
  226. package/vendor/include/networkit/generators/DynamicGraphSource.hpp +0 -79
  227. package/vendor/include/networkit/generators/DynamicHyperbolicGenerator.hpp +0 -143
  228. package/vendor/include/networkit/generators/DynamicPathGenerator.hpp +0 -26
  229. package/vendor/include/networkit/generators/DynamicPubWebGenerator.hpp +0 -54
  230. package/vendor/include/networkit/generators/EdgeSwitchingMarkovChainGenerator.hpp +0 -65
  231. package/vendor/include/networkit/generators/ErdosRenyiEnumerator.hpp +0 -318
  232. package/vendor/include/networkit/generators/ErdosRenyiGenerator.hpp +0 -56
  233. package/vendor/include/networkit/generators/HavelHakimiGenerator.hpp +0 -48
  234. package/vendor/include/networkit/generators/HyperbolicGenerator.hpp +0 -236
  235. package/vendor/include/networkit/generators/LFRGenerator.hpp +0 -175
  236. package/vendor/include/networkit/generators/MocnikGenerator.hpp +0 -147
  237. package/vendor/include/networkit/generators/MocnikGeneratorBasic.hpp +0 -58
  238. package/vendor/include/networkit/generators/PowerlawDegreeSequence.hpp +0 -128
  239. package/vendor/include/networkit/generators/PubWebGenerator.hpp +0 -94
  240. package/vendor/include/networkit/generators/RegularRingLatticeGenerator.hpp +0 -37
  241. package/vendor/include/networkit/generators/RmatGenerator.hpp +0 -67
  242. package/vendor/include/networkit/generators/StaticDegreeSequenceGenerator.hpp +0 -42
  243. package/vendor/include/networkit/generators/StaticGraphGenerator.hpp +0 -30
  244. package/vendor/include/networkit/generators/StochasticBlockmodel.hpp +0 -41
  245. package/vendor/include/networkit/generators/WattsStrogatzGenerator.hpp +0 -43
  246. package/vendor/include/networkit/generators/quadtree/QuadNode.hpp +0 -857
  247. package/vendor/include/networkit/generators/quadtree/QuadNodeCartesianEuclid.hpp +0 -587
  248. package/vendor/include/networkit/generators/quadtree/QuadNodePolarEuclid.hpp +0 -726
  249. package/vendor/include/networkit/generators/quadtree/Quadtree.hpp +0 -232
  250. package/vendor/include/networkit/generators/quadtree/QuadtreeCartesianEuclid.hpp +0 -149
  251. package/vendor/include/networkit/generators/quadtree/QuadtreePolarEuclid.hpp +0 -143
  252. package/vendor/include/networkit/geometric/HyperbolicSpace.hpp +0 -248
  253. package/vendor/include/networkit/geometric/Point2DWithIndex.hpp +0 -145
  254. package/vendor/include/networkit/global/ClusteringCoefficient.hpp +0 -42
  255. package/vendor/include/networkit/global/GlobalClusteringCoefficient.hpp +0 -24
  256. package/vendor/include/networkit/graph/Attributes.hpp +0 -568
  257. package/vendor/include/networkit/graph/BFS.hpp +0 -111
  258. package/vendor/include/networkit/graph/DFS.hpp +0 -71
  259. package/vendor/include/networkit/graph/Dijkstra.hpp +0 -83
  260. package/vendor/include/networkit/graph/EdgeIterators.hpp +0 -171
  261. package/vendor/include/networkit/graph/Graph.hpp +0 -2083
  262. package/vendor/include/networkit/graph/GraphBuilder.hpp +0 -289
  263. package/vendor/include/networkit/graph/GraphR.hpp +0 -133
  264. package/vendor/include/networkit/graph/GraphTools.hpp +0 -589
  265. package/vendor/include/networkit/graph/GraphW.hpp +0 -1236
  266. package/vendor/include/networkit/graph/KruskalMSF.hpp +0 -50
  267. package/vendor/include/networkit/graph/NeighborIterators.hpp +0 -163
  268. package/vendor/include/networkit/graph/NodeIterators.hpp +0 -127
  269. package/vendor/include/networkit/graph/PrimMSF.hpp +0 -66
  270. package/vendor/include/networkit/graph/RandomMaximumSpanningForest.hpp +0 -133
  271. package/vendor/include/networkit/graph/SpanningForest.hpp +0 -41
  272. package/vendor/include/networkit/graph/TopologicalSort.hpp +0 -87
  273. package/vendor/include/networkit/graph/UnionMaximumSpanningForest.hpp +0 -126
  274. package/vendor/include/networkit/graph/test/GraphBuilderBenchmark.hpp +0 -68
  275. package/vendor/include/networkit/independentset/IndependentSetFinder.hpp +0 -44
  276. package/vendor/include/networkit/independentset/Luby.hpp +0 -27
  277. package/vendor/include/networkit/io/BinaryEdgeListPartitionReader.hpp +0 -45
  278. package/vendor/include/networkit/io/BinaryEdgeListPartitionWriter.hpp +0 -47
  279. package/vendor/include/networkit/io/BinaryPartitionReader.hpp +0 -41
  280. package/vendor/include/networkit/io/BinaryPartitionWriter.hpp +0 -44
  281. package/vendor/include/networkit/io/CoverReader.hpp +0 -27
  282. package/vendor/include/networkit/io/CoverWriter.hpp +0 -21
  283. package/vendor/include/networkit/io/DGSReader.hpp +0 -39
  284. package/vendor/include/networkit/io/DibapGraphReader.hpp +0 -43
  285. package/vendor/include/networkit/io/DotGraphWriter.hpp +0 -39
  286. package/vendor/include/networkit/io/DotPartitionWriter.hpp +0 -23
  287. package/vendor/include/networkit/io/DynamicGraphReader.hpp +0 -29
  288. package/vendor/include/networkit/io/EdgeListCoverReader.hpp +0 -35
  289. package/vendor/include/networkit/io/EdgeListPartitionReader.hpp +0 -43
  290. package/vendor/include/networkit/io/EdgeListReader.hpp +0 -61
  291. package/vendor/include/networkit/io/EdgeListWriter.hpp +0 -48
  292. package/vendor/include/networkit/io/GMLGraphReader.hpp +0 -33
  293. package/vendor/include/networkit/io/GMLGraphWriter.hpp +0 -33
  294. package/vendor/include/networkit/io/GraphIO.hpp +0 -52
  295. package/vendor/include/networkit/io/GraphReader.hpp +0 -40
  296. package/vendor/include/networkit/io/GraphToolBinaryReader.hpp +0 -71
  297. package/vendor/include/networkit/io/GraphToolBinaryWriter.hpp +0 -61
  298. package/vendor/include/networkit/io/GraphWriter.hpp +0 -27
  299. package/vendor/include/networkit/io/KONECTGraphReader.hpp +0 -44
  300. package/vendor/include/networkit/io/LineFileReader.hpp +0 -42
  301. package/vendor/include/networkit/io/METISGraphReader.hpp +0 -36
  302. package/vendor/include/networkit/io/METISGraphWriter.hpp +0 -29
  303. package/vendor/include/networkit/io/METISParser.hpp +0 -63
  304. package/vendor/include/networkit/io/MTXGraphReader.hpp +0 -31
  305. package/vendor/include/networkit/io/MTXParser.hpp +0 -87
  306. package/vendor/include/networkit/io/MatrixMarketReader.hpp +0 -33
  307. package/vendor/include/networkit/io/MatrixReader.hpp +0 -33
  308. package/vendor/include/networkit/io/MemoryMappedFile.hpp +0 -80
  309. package/vendor/include/networkit/io/NetworkitBinaryGraph.hpp +0 -144
  310. package/vendor/include/networkit/io/NetworkitBinaryReader.hpp +0 -50
  311. package/vendor/include/networkit/io/NetworkitBinaryWriter.hpp +0 -71
  312. package/vendor/include/networkit/io/PartitionReader.hpp +0 -34
  313. package/vendor/include/networkit/io/PartitionWriter.hpp +0 -31
  314. package/vendor/include/networkit/io/RBGraphReader.hpp +0 -37
  315. package/vendor/include/networkit/io/RBMatrixReader.hpp +0 -49
  316. package/vendor/include/networkit/io/RasterReader.hpp +0 -40
  317. package/vendor/include/networkit/io/SNAPEdgeListPartitionReader.hpp +0 -28
  318. package/vendor/include/networkit/io/SNAPGraphReader.hpp +0 -53
  319. package/vendor/include/networkit/io/SNAPGraphWriter.hpp +0 -53
  320. package/vendor/include/networkit/io/ThrillGraphBinaryReader.hpp +0 -44
  321. package/vendor/include/networkit/io/ThrillGraphBinaryWriter.hpp +0 -27
  322. package/vendor/include/networkit/layout/LayoutAlgorithm.hpp +0 -39
  323. package/vendor/include/networkit/linkprediction/AdamicAdarIndex.hpp +0 -37
  324. package/vendor/include/networkit/linkprediction/AdjustedRandIndex.hpp +0 -36
  325. package/vendor/include/networkit/linkprediction/AlgebraicDistanceIndex.hpp +0 -70
  326. package/vendor/include/networkit/linkprediction/CommonNeighborsIndex.hpp +0 -39
  327. package/vendor/include/networkit/linkprediction/EvaluationMetric.hpp +0 -135
  328. package/vendor/include/networkit/linkprediction/JaccardIndex.hpp +0 -44
  329. package/vendor/include/networkit/linkprediction/KatzIndex.hpp +0 -84
  330. package/vendor/include/networkit/linkprediction/LinkPredictor.hpp +0 -98
  331. package/vendor/include/networkit/linkprediction/LinkThresholder.hpp +0 -56
  332. package/vendor/include/networkit/linkprediction/MissingLinksFinder.hpp +0 -60
  333. package/vendor/include/networkit/linkprediction/NeighborhoodDistanceIndex.hpp +0 -42
  334. package/vendor/include/networkit/linkprediction/NeighborhoodUtility.hpp +0 -54
  335. package/vendor/include/networkit/linkprediction/NeighborsMeasureIndex.hpp +0 -48
  336. package/vendor/include/networkit/linkprediction/PrecisionRecallMetric.hpp +0 -40
  337. package/vendor/include/networkit/linkprediction/PredictionsSorter.hpp +0 -66
  338. package/vendor/include/networkit/linkprediction/PreferentialAttachmentIndex.hpp +0 -37
  339. package/vendor/include/networkit/linkprediction/ROCMetric.hpp +0 -39
  340. package/vendor/include/networkit/linkprediction/RandomLinkSampler.hpp +0 -47
  341. package/vendor/include/networkit/linkprediction/ResourceAllocationIndex.hpp +0 -38
  342. package/vendor/include/networkit/linkprediction/SameCommunityIndex.hpp +0 -50
  343. package/vendor/include/networkit/linkprediction/TotalNeighborsIndex.hpp +0 -39
  344. package/vendor/include/networkit/linkprediction/UDegreeIndex.hpp +0 -35
  345. package/vendor/include/networkit/linkprediction/VDegreeIndex.hpp +0 -35
  346. package/vendor/include/networkit/matching/BMatcher.hpp +0 -52
  347. package/vendor/include/networkit/matching/BMatching.hpp +0 -115
  348. package/vendor/include/networkit/matching/BSuitorMatcher.hpp +0 -170
  349. package/vendor/include/networkit/matching/DynamicBSuitorMatcher.hpp +0 -78
  350. package/vendor/include/networkit/matching/LocalMaxMatcher.hpp +0 -35
  351. package/vendor/include/networkit/matching/Matcher.hpp +0 -55
  352. package/vendor/include/networkit/matching/Matching.hpp +0 -111
  353. package/vendor/include/networkit/matching/PathGrowingMatcher.hpp +0 -46
  354. package/vendor/include/networkit/matching/SuitorMatcher.hpp +0 -62
  355. package/vendor/include/networkit/numerics/ConjugateGradient.hpp +0 -163
  356. package/vendor/include/networkit/numerics/GaussSeidelRelaxation.hpp +0 -99
  357. package/vendor/include/networkit/numerics/LAMG/LAMGSettings.hpp +0 -70
  358. package/vendor/include/networkit/numerics/LAMG/Lamg.hpp +0 -460
  359. package/vendor/include/networkit/numerics/LAMG/Level/EliminationStage.hpp +0 -47
  360. package/vendor/include/networkit/numerics/LAMG/Level/Level.hpp +0 -56
  361. package/vendor/include/networkit/numerics/LAMG/Level/LevelAggregation.hpp +0 -52
  362. package/vendor/include/networkit/numerics/LAMG/Level/LevelElimination.hpp +0 -133
  363. package/vendor/include/networkit/numerics/LAMG/Level/LevelFinest.hpp +0 -28
  364. package/vendor/include/networkit/numerics/LAMG/LevelHierarchy.hpp +0 -165
  365. package/vendor/include/networkit/numerics/LAMG/MultiLevelSetup.hpp +0 -1090
  366. package/vendor/include/networkit/numerics/LAMG/SolverLamg.hpp +0 -316
  367. package/vendor/include/networkit/numerics/LinearSolver.hpp +0 -151
  368. package/vendor/include/networkit/numerics/Preconditioner/DiagonalPreconditioner.hpp +0 -61
  369. package/vendor/include/networkit/numerics/Preconditioner/IdentityPreconditioner.hpp +0 -36
  370. package/vendor/include/networkit/numerics/Smoother.hpp +0 -37
  371. package/vendor/include/networkit/overlap/HashingOverlapper.hpp +0 -28
  372. package/vendor/include/networkit/overlap/Overlapper.hpp +0 -27
  373. package/vendor/include/networkit/planarity/LeftRightPlanarityCheck.hpp +0 -113
  374. package/vendor/include/networkit/randomization/Curveball.hpp +0 -49
  375. package/vendor/include/networkit/randomization/CurveballGlobalTradeGenerator.hpp +0 -39
  376. package/vendor/include/networkit/randomization/CurveballUniformTradeGenerator.hpp +0 -39
  377. package/vendor/include/networkit/randomization/DegreePreservingShuffle.hpp +0 -82
  378. package/vendor/include/networkit/randomization/EdgeSwitching.hpp +0 -157
  379. package/vendor/include/networkit/randomization/GlobalCurveball.hpp +0 -69
  380. package/vendor/include/networkit/randomization/GlobalTradeSequence.hpp +0 -303
  381. package/vendor/include/networkit/reachability/AllSimplePaths.hpp +0 -122
  382. package/vendor/include/networkit/reachability/ReachableNodes.hpp +0 -83
  383. package/vendor/include/networkit/scd/ApproximatePageRank.hpp +0 -51
  384. package/vendor/include/networkit/scd/CliqueDetect.hpp +0 -55
  385. package/vendor/include/networkit/scd/CombinedSCD.hpp +0 -51
  386. package/vendor/include/networkit/scd/GCE.hpp +0 -42
  387. package/vendor/include/networkit/scd/LFMLocal.hpp +0 -54
  388. package/vendor/include/networkit/scd/LocalT.hpp +0 -40
  389. package/vendor/include/networkit/scd/LocalTightnessExpansion.hpp +0 -46
  390. package/vendor/include/networkit/scd/PageRankNibble.hpp +0 -55
  391. package/vendor/include/networkit/scd/RandomBFS.hpp +0 -33
  392. package/vendor/include/networkit/scd/SCDGroundTruthComparison.hpp +0 -121
  393. package/vendor/include/networkit/scd/SelectiveCommunityDetector.hpp +0 -76
  394. package/vendor/include/networkit/scd/SetConductance.hpp +0 -47
  395. package/vendor/include/networkit/scd/TCE.hpp +0 -41
  396. package/vendor/include/networkit/scd/TwoPhaseL.hpp +0 -40
  397. package/vendor/include/networkit/scoring/EdgeScoring.hpp +0 -44
  398. package/vendor/include/networkit/scoring/ModularityScoring.hpp +0 -79
  399. package/vendor/include/networkit/simulation/EpidemicSimulationSEIR.hpp +0 -59
  400. package/vendor/include/networkit/sparsification/ChanceCorrectedTriangleScore.hpp +0 -28
  401. package/vendor/include/networkit/sparsification/ForestFireScore.hpp +0 -34
  402. package/vendor/include/networkit/sparsification/GlobalThresholdFilter.hpp +0 -40
  403. package/vendor/include/networkit/sparsification/LocalDegreeScore.hpp +0 -30
  404. package/vendor/include/networkit/sparsification/LocalFilterScore.hpp +0 -124
  405. package/vendor/include/networkit/sparsification/LocalSimilarityScore.hpp +0 -63
  406. package/vendor/include/networkit/sparsification/MultiscaleScore.hpp +0 -38
  407. package/vendor/include/networkit/sparsification/RandomEdgeScore.hpp +0 -33
  408. package/vendor/include/networkit/sparsification/RandomNodeEdgeScore.hpp +0 -29
  409. package/vendor/include/networkit/sparsification/SCANStructuralSimilarityScore.hpp +0 -23
  410. package/vendor/include/networkit/sparsification/SimmelianOverlapScore.hpp +0 -35
  411. package/vendor/include/networkit/sparsification/SimmelianScore.hpp +0 -92
  412. package/vendor/include/networkit/sparsification/Sparsifiers.hpp +0 -166
  413. package/vendor/include/networkit/structures/Cover.hpp +0 -248
  414. package/vendor/include/networkit/structures/LocalCommunity.hpp +0 -363
  415. package/vendor/include/networkit/structures/Partition.hpp +0 -335
  416. package/vendor/include/networkit/structures/UnionFind.hpp +0 -66
  417. package/vendor/include/networkit/viz/GraphLayoutAlgorithm.hpp +0 -157
  418. package/vendor/include/networkit/viz/MaxentStress.hpp +0 -346
  419. package/vendor/include/networkit/viz/Octree.hpp +0 -428
  420. package/vendor/include/networkit/viz/PivotMDS.hpp +0 -63
  421. package/vendor/include/networkit/viz/Point.hpp +0 -415
  422. package/vendor/include/networkit/viz/PostscriptWriter.hpp +0 -78
  423. package/vendor/include/tlx/algorithm/exclusive_scan.hpp +0 -56
  424. package/vendor/include/tlx/algorithm/is_sorted_cmp.hpp +0 -56
  425. package/vendor/include/tlx/algorithm/merge_advance.hpp +0 -177
  426. package/vendor/include/tlx/algorithm/merge_combine.hpp +0 -76
  427. package/vendor/include/tlx/algorithm/multisequence_partition.hpp +0 -346
  428. package/vendor/include/tlx/algorithm/multisequence_selection.hpp +0 -351
  429. package/vendor/include/tlx/algorithm/multiway_merge.hpp +0 -1385
  430. package/vendor/include/tlx/algorithm/multiway_merge_splitting.hpp +0 -257
  431. package/vendor/include/tlx/algorithm/parallel_multiway_merge.hpp +0 -408
  432. package/vendor/include/tlx/algorithm/random_bipartition_shuffle.hpp +0 -116
  433. package/vendor/include/tlx/algorithm.hpp +0 -36
  434. package/vendor/include/tlx/allocator_base.hpp +0 -100
  435. package/vendor/include/tlx/backtrace.hpp +0 -54
  436. package/vendor/include/tlx/cmdline_parser.hpp +0 -498
  437. package/vendor/include/tlx/container/btree.hpp +0 -3977
  438. package/vendor/include/tlx/container/btree_map.hpp +0 -634
  439. package/vendor/include/tlx/container/btree_multimap.hpp +0 -627
  440. package/vendor/include/tlx/container/btree_multiset.hpp +0 -612
  441. package/vendor/include/tlx/container/btree_set.hpp +0 -612
  442. package/vendor/include/tlx/container/d_ary_addressable_int_heap.hpp +0 -416
  443. package/vendor/include/tlx/container/d_ary_heap.hpp +0 -311
  444. package/vendor/include/tlx/container/loser_tree.hpp +0 -1009
  445. package/vendor/include/tlx/container/lru_cache.hpp +0 -319
  446. package/vendor/include/tlx/container/radix_heap.hpp +0 -735
  447. package/vendor/include/tlx/container/ring_buffer.hpp +0 -428
  448. package/vendor/include/tlx/container/simple_vector.hpp +0 -304
  449. package/vendor/include/tlx/container/splay_tree.hpp +0 -399
  450. package/vendor/include/tlx/container/string_view.hpp +0 -805
  451. package/vendor/include/tlx/container.hpp +0 -40
  452. package/vendor/include/tlx/counting_ptr.hpp +0 -522
  453. package/vendor/include/tlx/define/attribute_always_inline.hpp +0 -34
  454. package/vendor/include/tlx/define/attribute_fallthrough.hpp +0 -36
  455. package/vendor/include/tlx/define/attribute_format_printf.hpp +0 -34
  456. package/vendor/include/tlx/define/attribute_packed.hpp +0 -34
  457. package/vendor/include/tlx/define/attribute_warn_unused_result.hpp +0 -34
  458. package/vendor/include/tlx/define/constexpr.hpp +0 -31
  459. package/vendor/include/tlx/define/deprecated.hpp +0 -39
  460. package/vendor/include/tlx/define/endian.hpp +0 -49
  461. package/vendor/include/tlx/define/likely.hpp +0 -33
  462. package/vendor/include/tlx/define/visibility_hidden.hpp +0 -34
  463. package/vendor/include/tlx/define.hpp +0 -36
  464. package/vendor/include/tlx/delegate.hpp +0 -524
  465. package/vendor/include/tlx/die/core.hpp +0 -311
  466. package/vendor/include/tlx/die.hpp +0 -106
  467. package/vendor/include/tlx/digest/md5.hpp +0 -81
  468. package/vendor/include/tlx/digest/sha1.hpp +0 -81
  469. package/vendor/include/tlx/digest/sha256.hpp +0 -81
  470. package/vendor/include/tlx/digest/sha512.hpp +0 -81
  471. package/vendor/include/tlx/digest.hpp +0 -30
  472. package/vendor/include/tlx/logger/all.hpp +0 -33
  473. package/vendor/include/tlx/logger/array.hpp +0 -43
  474. package/vendor/include/tlx/logger/core.hpp +0 -287
  475. package/vendor/include/tlx/logger/deque.hpp +0 -42
  476. package/vendor/include/tlx/logger/map.hpp +0 -65
  477. package/vendor/include/tlx/logger/set.hpp +0 -60
  478. package/vendor/include/tlx/logger/tuple.hpp +0 -66
  479. package/vendor/include/tlx/logger/unordered_map.hpp +0 -68
  480. package/vendor/include/tlx/logger/unordered_set.hpp +0 -64
  481. package/vendor/include/tlx/logger/wrap_unprintable.hpp +0 -75
  482. package/vendor/include/tlx/logger.hpp +0 -44
  483. package/vendor/include/tlx/math/abs_diff.hpp +0 -35
  484. package/vendor/include/tlx/math/aggregate.hpp +0 -231
  485. package/vendor/include/tlx/math/aggregate_min_max.hpp +0 -116
  486. package/vendor/include/tlx/math/bswap.hpp +0 -148
  487. package/vendor/include/tlx/math/bswap_be.hpp +0 -79
  488. package/vendor/include/tlx/math/bswap_le.hpp +0 -79
  489. package/vendor/include/tlx/math/clz.hpp +0 -174
  490. package/vendor/include/tlx/math/ctz.hpp +0 -174
  491. package/vendor/include/tlx/math/div_ceil.hpp +0 -36
  492. package/vendor/include/tlx/math/ffs.hpp +0 -123
  493. package/vendor/include/tlx/math/integer_log2.hpp +0 -189
  494. package/vendor/include/tlx/math/is_power_of_two.hpp +0 -74
  495. package/vendor/include/tlx/math/polynomial_regression.hpp +0 -243
  496. package/vendor/include/tlx/math/popcount.hpp +0 -173
  497. package/vendor/include/tlx/math/power_to_the.hpp +0 -44
  498. package/vendor/include/tlx/math/rol.hpp +0 -112
  499. package/vendor/include/tlx/math/ror.hpp +0 -112
  500. package/vendor/include/tlx/math/round_to_power_of_two.hpp +0 -121
  501. package/vendor/include/tlx/math/round_up.hpp +0 -36
  502. package/vendor/include/tlx/math/sgn.hpp +0 -38
  503. package/vendor/include/tlx/math.hpp +0 -46
  504. package/vendor/include/tlx/meta/apply_tuple.hpp +0 -55
  505. package/vendor/include/tlx/meta/call_for_range.hpp +0 -78
  506. package/vendor/include/tlx/meta/call_foreach.hpp +0 -60
  507. package/vendor/include/tlx/meta/call_foreach_tuple.hpp +0 -60
  508. package/vendor/include/tlx/meta/call_foreach_tuple_with_index.hpp +0 -61
  509. package/vendor/include/tlx/meta/call_foreach_with_index.hpp +0 -64
  510. package/vendor/include/tlx/meta/enable_if.hpp +0 -37
  511. package/vendor/include/tlx/meta/fold_left.hpp +0 -63
  512. package/vendor/include/tlx/meta/fold_left_tuple.hpp +0 -60
  513. package/vendor/include/tlx/meta/fold_right.hpp +0 -63
  514. package/vendor/include/tlx/meta/fold_right_tuple.hpp +0 -60
  515. package/vendor/include/tlx/meta/function_chain.hpp +0 -197
  516. package/vendor/include/tlx/meta/function_stack.hpp +0 -189
  517. package/vendor/include/tlx/meta/has_member.hpp +0 -80
  518. package/vendor/include/tlx/meta/has_method.hpp +0 -117
  519. package/vendor/include/tlx/meta/index_sequence.hpp +0 -66
  520. package/vendor/include/tlx/meta/is_std_array.hpp +0 -40
  521. package/vendor/include/tlx/meta/is_std_pair.hpp +0 -39
  522. package/vendor/include/tlx/meta/is_std_tuple.hpp +0 -39
  523. package/vendor/include/tlx/meta/is_std_vector.hpp +0 -39
  524. package/vendor/include/tlx/meta/log2.hpp +0 -101
  525. package/vendor/include/tlx/meta/no_operation.hpp +0 -55
  526. package/vendor/include/tlx/meta/static_index.hpp +0 -42
  527. package/vendor/include/tlx/meta/vexpand.hpp +0 -34
  528. package/vendor/include/tlx/meta/vmap_for_range.hpp +0 -84
  529. package/vendor/include/tlx/meta/vmap_foreach.hpp +0 -63
  530. package/vendor/include/tlx/meta/vmap_foreach_tuple.hpp +0 -59
  531. package/vendor/include/tlx/meta/vmap_foreach_tuple_with_index.hpp +0 -62
  532. package/vendor/include/tlx/meta/vmap_foreach_with_index.hpp +0 -70
  533. package/vendor/include/tlx/meta.hpp +0 -55
  534. package/vendor/include/tlx/multi_timer.hpp +0 -148
  535. package/vendor/include/tlx/port/setenv.hpp +0 -31
  536. package/vendor/include/tlx/port.hpp +0 -27
  537. package/vendor/include/tlx/semaphore.hpp +0 -119
  538. package/vendor/include/tlx/simple_vector.hpp +0 -20
  539. package/vendor/include/tlx/siphash.hpp +0 -282
  540. package/vendor/include/tlx/sort/networks/best.hpp +0 -611
  541. package/vendor/include/tlx/sort/networks/bose_nelson.hpp +0 -412
  542. package/vendor/include/tlx/sort/networks/bose_nelson_parameter.hpp +0 -507
  543. package/vendor/include/tlx/sort/networks/cswap.hpp +0 -60
  544. package/vendor/include/tlx/sort/parallel_mergesort.hpp +0 -398
  545. package/vendor/include/tlx/sort/strings/insertion_sort.hpp +0 -232
  546. package/vendor/include/tlx/sort/strings/multikey_quicksort.hpp +0 -185
  547. package/vendor/include/tlx/sort/strings/parallel_sample_sort.hpp +0 -1647
  548. package/vendor/include/tlx/sort/strings/radix_sort.hpp +0 -934
  549. package/vendor/include/tlx/sort/strings/sample_sort_tools.hpp +0 -756
  550. package/vendor/include/tlx/sort/strings/string_ptr.hpp +0 -426
  551. package/vendor/include/tlx/sort/strings/string_set.hpp +0 -800
  552. package/vendor/include/tlx/sort/strings.hpp +0 -329
  553. package/vendor/include/tlx/sort/strings_parallel.hpp +0 -325
  554. package/vendor/include/tlx/sort.hpp +0 -29
  555. package/vendor/include/tlx/stack_allocator.hpp +0 -226
  556. package/vendor/include/tlx/string/appendline.hpp +0 -35
  557. package/vendor/include/tlx/string/base64.hpp +0 -87
  558. package/vendor/include/tlx/string/bitdump.hpp +0 -139
  559. package/vendor/include/tlx/string/compare_icase.hpp +0 -42
  560. package/vendor/include/tlx/string/contains.hpp +0 -36
  561. package/vendor/include/tlx/string/contains_word.hpp +0 -42
  562. package/vendor/include/tlx/string/ends_with.hpp +0 -79
  563. package/vendor/include/tlx/string/equal_icase.hpp +0 -42
  564. package/vendor/include/tlx/string/erase_all.hpp +0 -70
  565. package/vendor/include/tlx/string/escape_html.hpp +0 -34
  566. package/vendor/include/tlx/string/escape_uri.hpp +0 -34
  567. package/vendor/include/tlx/string/expand_environment_variables.hpp +0 -49
  568. package/vendor/include/tlx/string/extract_between.hpp +0 -40
  569. package/vendor/include/tlx/string/format_iec_units.hpp +0 -32
  570. package/vendor/include/tlx/string/format_si_iec_units.hpp +0 -19
  571. package/vendor/include/tlx/string/format_si_units.hpp +0 -32
  572. package/vendor/include/tlx/string/hash_djb2.hpp +0 -87
  573. package/vendor/include/tlx/string/hash_sdbm.hpp +0 -86
  574. package/vendor/include/tlx/string/hexdump.hpp +0 -154
  575. package/vendor/include/tlx/string/index_of.hpp +0 -56
  576. package/vendor/include/tlx/string/join.hpp +0 -65
  577. package/vendor/include/tlx/string/join_generic.hpp +0 -89
  578. package/vendor/include/tlx/string/join_quoted.hpp +0 -46
  579. package/vendor/include/tlx/string/less_icase.hpp +0 -64
  580. package/vendor/include/tlx/string/levenshtein.hpp +0 -193
  581. package/vendor/include/tlx/string/pad.hpp +0 -39
  582. package/vendor/include/tlx/string/parse_si_iec_units.hpp +0 -46
  583. package/vendor/include/tlx/string/parse_uri.hpp +0 -66
  584. package/vendor/include/tlx/string/parse_uri_form_data.hpp +0 -136
  585. package/vendor/include/tlx/string/replace.hpp +0 -141
  586. package/vendor/include/tlx/string/split.hpp +0 -170
  587. package/vendor/include/tlx/string/split_quoted.hpp +0 -49
  588. package/vendor/include/tlx/string/split_view.hpp +0 -218
  589. package/vendor/include/tlx/string/split_words.hpp +0 -53
  590. package/vendor/include/tlx/string/ssprintf.hpp +0 -45
  591. package/vendor/include/tlx/string/ssprintf_generic.hpp +0 -95
  592. package/vendor/include/tlx/string/starts_with.hpp +0 -44
  593. package/vendor/include/tlx/string/to_lower.hpp +0 -47
  594. package/vendor/include/tlx/string/to_upper.hpp +0 -47
  595. package/vendor/include/tlx/string/trim.hpp +0 -298
  596. package/vendor/include/tlx/string/union_words.hpp +0 -33
  597. package/vendor/include/tlx/string/word_wrap.hpp +0 -35
  598. package/vendor/include/tlx/string.hpp +0 -68
  599. package/vendor/include/tlx/thread_barrier_mutex.hpp +0 -109
  600. package/vendor/include/tlx/thread_barrier_spin.hpp +0 -127
  601. package/vendor/include/tlx/thread_pool.hpp +0 -151
  602. package/vendor/include/tlx/timestamp.hpp +0 -23
  603. package/vendor/include/tlx/unused.hpp +0 -28
  604. package/vendor/include/tlx/vector_free.hpp +0 -30
  605. package/vendor/include/tlx/version.hpp +0 -49
  606. package/vendor/include/ttmath/ttmath.h +0 -2881
  607. package/vendor/include/ttmath/ttmathbig.h +0 -6111
  608. package/vendor/include/ttmath/ttmathdec.h +0 -419
  609. package/vendor/include/ttmath/ttmathint.h +0 -1923
  610. package/vendor/include/ttmath/ttmathmisc.h +0 -250
  611. package/vendor/include/ttmath/ttmathobjects.h +0 -812
  612. package/vendor/include/ttmath/ttmathparser.h +0 -2791
  613. package/vendor/include/ttmath/ttmaththreads.h +0 -252
  614. package/vendor/include/ttmath/ttmathtypes.h +0 -707
  615. package/vendor/include/ttmath/ttmathuint.h +0 -4190
  616. package/vendor/include/ttmath/ttmathuint_noasm.h +0 -1038
  617. package/vendor/include/ttmath/ttmathuint_x86.h +0 -1620
  618. package/vendor/include/ttmath/ttmathuint_x86_64.h +0 -1177
  619. package/vendor/lib/cmake/tlx/tlx-config.cmake +0 -51
  620. package/vendor/lib/cmake/tlx/tlx-targets-release.cmake +0 -19
  621. package/vendor/lib/cmake/tlx/tlx-targets.cmake +0 -106
  622. package/vendor/lib/cmake/tlx/tlx-version.cmake +0 -11
  623. package/vendor/lib/libtlx.a +0 -0
  624. package/vendor/lib/pkgconfig/networkit.pc +0 -11
  625. package/vendor/lib/pkgconfig/tlx.pc +0 -11
@@ -1,1647 +0,0 @@
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
- /******************************************************************************/