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