@ladybugmem/icebug 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +32 -10
- package/lib/index.js +23 -11
- package/package.json +8 -13
- package/prebuilds/darwin-arm64/icebug.node +0 -0
- package/{vendor/lib → prebuilds/darwin-arm64}/libnetworkit.dylib +0 -0
- package/prebuilds/linux-x64/icebug.node +0 -0
- package/prebuilds/linux-x64/libnetworkit.so +0 -0
- package/scripts/download-icebug.sh +92 -0
- package/build/Release/.deps/Release/icebug.node.d +0 -1
- package/build/Release/.deps/Release/obj.target/icebug/src/addon.o.d +0 -291
- package/build/Release/icebug.node +0 -0
- package/build/Release/obj.target/icebug/src/addon.o +0 -0
- package/vendor/include/networkit/GlobalState.hpp +0 -86
- package/vendor/include/networkit/Globals.hpp +0 -41
- package/vendor/include/networkit/algebraic/AlgebraicGlobals.hpp +0 -27
- package/vendor/include/networkit/algebraic/CSRGeneralMatrix.hpp +0 -1292
- package/vendor/include/networkit/algebraic/CSRMatrix.hpp +0 -11
- package/vendor/include/networkit/algebraic/DenseMatrix.hpp +0 -537
- package/vendor/include/networkit/algebraic/DynamicMatrix.hpp +0 -514
- package/vendor/include/networkit/algebraic/GraphBLAS.hpp +0 -323
- package/vendor/include/networkit/algebraic/MatrixTools.hpp +0 -156
- package/vendor/include/networkit/algebraic/Semirings.hpp +0 -171
- package/vendor/include/networkit/algebraic/SparseAccumulator.hpp +0 -111
- package/vendor/include/networkit/algebraic/Vector.hpp +0 -371
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicBFS.hpp +0 -72
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicBellmanFord.hpp +0 -88
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicMatchingCoarsening.hpp +0 -96
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicPageRank.hpp +0 -145
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicSpanningEdgeCentrality.hpp +0 -122
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicTriangleCounting.hpp +0 -76
- package/vendor/include/networkit/auxiliary/AlignedAllocator.hpp +0 -113
- package/vendor/include/networkit/auxiliary/ArrayTools.hpp +0 -85
- package/vendor/include/networkit/auxiliary/BloomFilter.hpp +0 -70
- package/vendor/include/networkit/auxiliary/BucketPQ.hpp +0 -142
- package/vendor/include/networkit/auxiliary/Enforce.hpp +0 -117
- package/vendor/include/networkit/auxiliary/FunctionTraits.hpp +0 -74
- package/vendor/include/networkit/auxiliary/HashUtils.hpp +0 -28
- package/vendor/include/networkit/auxiliary/IncrementalUniformRandomSelector.hpp +0 -52
- package/vendor/include/networkit/auxiliary/Log.hpp +0 -119
- package/vendor/include/networkit/auxiliary/MissingMath.hpp +0 -48
- package/vendor/include/networkit/auxiliary/Multiprecision.hpp +0 -17
- package/vendor/include/networkit/auxiliary/NumberParsing.hpp +0 -307
- package/vendor/include/networkit/auxiliary/NumericTools.hpp +0 -57
- package/vendor/include/networkit/auxiliary/Parallel.hpp +0 -56
- package/vendor/include/networkit/auxiliary/Parallelism.hpp +0 -33
- package/vendor/include/networkit/auxiliary/PrioQueue.hpp +0 -252
- package/vendor/include/networkit/auxiliary/Random.hpp +0 -122
- package/vendor/include/networkit/auxiliary/SetIntersector.hpp +0 -72
- package/vendor/include/networkit/auxiliary/SignalHandling.hpp +0 -39
- package/vendor/include/networkit/auxiliary/SortedList.hpp +0 -128
- package/vendor/include/networkit/auxiliary/SparseVector.hpp +0 -215
- package/vendor/include/networkit/auxiliary/SpinLock.hpp +0 -23
- package/vendor/include/networkit/auxiliary/StringBuilder.hpp +0 -322
- package/vendor/include/networkit/auxiliary/StringTools.hpp +0 -76
- package/vendor/include/networkit/auxiliary/TemplateUtils.hpp +0 -76
- package/vendor/include/networkit/auxiliary/Timer.hpp +0 -145
- package/vendor/include/networkit/auxiliary/VectorComparator.hpp +0 -32
- package/vendor/include/networkit/base/Algorithm.hpp +0 -41
- package/vendor/include/networkit/base/DynAlgorithm.hpp +0 -31
- package/vendor/include/networkit/centrality/ApproxBetweenness.hpp +0 -62
- package/vendor/include/networkit/centrality/ApproxCloseness.hpp +0 -136
- package/vendor/include/networkit/centrality/ApproxElectricalCloseness.hpp +0 -156
- package/vendor/include/networkit/centrality/ApproxGroupBetweenness.hpp +0 -124
- package/vendor/include/networkit/centrality/ApproxSpanningEdge.hpp +0 -84
- package/vendor/include/networkit/centrality/Betweenness.hpp +0 -47
- package/vendor/include/networkit/centrality/Centrality.hpp +0 -98
- package/vendor/include/networkit/centrality/Closeness.hpp +0 -107
- package/vendor/include/networkit/centrality/ComplexPaths.hpp +0 -113
- package/vendor/include/networkit/centrality/CoreDecomposition.hpp +0 -161
- package/vendor/include/networkit/centrality/DegreeCentrality.hpp +0 -55
- package/vendor/include/networkit/centrality/DynApproxBetweenness.hpp +0 -95
- package/vendor/include/networkit/centrality/DynBetweenness.hpp +0 -99
- package/vendor/include/networkit/centrality/DynBetweennessOneNode.hpp +0 -98
- package/vendor/include/networkit/centrality/DynKatzCentrality.hpp +0 -115
- package/vendor/include/networkit/centrality/DynTopHarmonicCloseness.hpp +0 -223
- package/vendor/include/networkit/centrality/EigenvectorCentrality.hpp +0 -41
- package/vendor/include/networkit/centrality/EstimateBetweenness.hpp +0 -51
- package/vendor/include/networkit/centrality/ForestCentrality.hpp +0 -112
- package/vendor/include/networkit/centrality/GedWalk.hpp +0 -225
- package/vendor/include/networkit/centrality/GroupCloseness.hpp +0 -115
- package/vendor/include/networkit/centrality/GroupClosenessGrowShrink.hpp +0 -78
- package/vendor/include/networkit/centrality/GroupClosenessLocalSearch.hpp +0 -77
- package/vendor/include/networkit/centrality/GroupClosenessLocalSwaps.hpp +0 -106
- package/vendor/include/networkit/centrality/GroupDegree.hpp +0 -155
- package/vendor/include/networkit/centrality/GroupHarmonicCloseness.hpp +0 -83
- package/vendor/include/networkit/centrality/HarmonicCloseness.hpp +0 -48
- package/vendor/include/networkit/centrality/KPathCentrality.hpp +0 -52
- package/vendor/include/networkit/centrality/KadabraBetweenness.hpp +0 -242
- package/vendor/include/networkit/centrality/KatzCentrality.hpp +0 -62
- package/vendor/include/networkit/centrality/LaplacianCentrality.hpp +0 -44
- package/vendor/include/networkit/centrality/LocalClusteringCoefficient.hpp +0 -60
- package/vendor/include/networkit/centrality/LocalPartitionCoverage.hpp +0 -43
- package/vendor/include/networkit/centrality/LocalSquareClusteringCoefficient.hpp +0 -42
- package/vendor/include/networkit/centrality/PageRank.hpp +0 -101
- package/vendor/include/networkit/centrality/PermanenceCentrality.hpp +0 -48
- package/vendor/include/networkit/centrality/Sfigality.hpp +0 -45
- package/vendor/include/networkit/centrality/SpanningEdgeCentrality.hpp +0 -86
- package/vendor/include/networkit/centrality/TopCloseness.hpp +0 -136
- package/vendor/include/networkit/centrality/TopHarmonicCloseness.hpp +0 -151
- package/vendor/include/networkit/clique/MaximalCliques.hpp +0 -83
- package/vendor/include/networkit/coarsening/ClusteringProjector.hpp +0 -59
- package/vendor/include/networkit/coarsening/CoarsenedGraphView.hpp +0 -156
- package/vendor/include/networkit/coarsening/GraphCoarsening.hpp +0 -57
- package/vendor/include/networkit/coarsening/MatchingCoarsening.hpp +0 -43
- package/vendor/include/networkit/coarsening/ParallelPartitionCoarsening.hpp +0 -33
- package/vendor/include/networkit/coarsening/ParallelPartitionCoarseningView.hpp +0 -62
- package/vendor/include/networkit/community/AdjustedRandMeasure.hpp +0 -31
- package/vendor/include/networkit/community/ClusteringGenerator.hpp +0 -75
- package/vendor/include/networkit/community/CommunityDetectionAlgorithm.hpp +0 -58
- package/vendor/include/networkit/community/Conductance.hpp +0 -32
- package/vendor/include/networkit/community/CoverF1Similarity.hpp +0 -53
- package/vendor/include/networkit/community/CoverHubDominance.hpp +0 -38
- package/vendor/include/networkit/community/Coverage.hpp +0 -25
- package/vendor/include/networkit/community/CutClustering.hpp +0 -62
- package/vendor/include/networkit/community/DissimilarityMeasure.hpp +0 -31
- package/vendor/include/networkit/community/DynamicNMIDistance.hpp +0 -44
- package/vendor/include/networkit/community/EdgeCut.hpp +0 -24
- package/vendor/include/networkit/community/GraphClusteringTools.hpp +0 -103
- package/vendor/include/networkit/community/GraphStructuralRandMeasure.hpp +0 -28
- package/vendor/include/networkit/community/HubDominance.hpp +0 -46
- package/vendor/include/networkit/community/IntrapartitionDensity.hpp +0 -44
- package/vendor/include/networkit/community/IsolatedInterpartitionConductance.hpp +0 -40
- package/vendor/include/networkit/community/IsolatedInterpartitionExpansion.hpp +0 -40
- package/vendor/include/networkit/community/JaccardMeasure.hpp +0 -25
- package/vendor/include/networkit/community/LFM.hpp +0 -49
- package/vendor/include/networkit/community/LPDegreeOrdered.hpp +0 -48
- package/vendor/include/networkit/community/LocalCommunityEvaluation.hpp +0 -100
- package/vendor/include/networkit/community/LocalCoverEvaluation.hpp +0 -31
- package/vendor/include/networkit/community/LocalPartitionEvaluation.hpp +0 -31
- package/vendor/include/networkit/community/LouvainMapEquation.hpp +0 -135
- package/vendor/include/networkit/community/Modularity.hpp +0 -54
- package/vendor/include/networkit/community/NMIDistance.hpp +0 -28
- package/vendor/include/networkit/community/NodeStructuralRandMeasure.hpp +0 -27
- package/vendor/include/networkit/community/OverlappingCommunityDetectionAlgorithm.hpp +0 -51
- package/vendor/include/networkit/community/OverlappingNMIDistance.hpp +0 -175
- package/vendor/include/networkit/community/PLM.hpp +0 -89
- package/vendor/include/networkit/community/PLP.hpp +0 -83
- package/vendor/include/networkit/community/ParallelAgglomerativeClusterer.hpp +0 -37
- package/vendor/include/networkit/community/ParallelLeiden.hpp +0 -96
- package/vendor/include/networkit/community/ParallelLeidenView.hpp +0 -138
- package/vendor/include/networkit/community/PartitionFragmentation.hpp +0 -30
- package/vendor/include/networkit/community/PartitionHubDominance.hpp +0 -37
- package/vendor/include/networkit/community/PartitionIntersection.hpp +0 -25
- package/vendor/include/networkit/community/QualityMeasure.hpp +0 -27
- package/vendor/include/networkit/community/SampledGraphStructuralRandMeasure.hpp +0 -40
- package/vendor/include/networkit/community/SampledNodeStructuralRandMeasure.hpp +0 -40
- package/vendor/include/networkit/community/StablePartitionNodes.hpp +0 -48
- package/vendor/include/networkit/components/BiconnectedComponents.hpp +0 -116
- package/vendor/include/networkit/components/ComponentDecomposition.hpp +0 -72
- package/vendor/include/networkit/components/ConnectedComponents.hpp +0 -55
- package/vendor/include/networkit/components/DynConnectedComponents.hpp +0 -71
- package/vendor/include/networkit/components/DynWeaklyConnectedComponents.hpp +0 -73
- package/vendor/include/networkit/components/ParallelConnectedComponents.hpp +0 -44
- package/vendor/include/networkit/components/RandomSpanningForest.hpp +0 -36
- package/vendor/include/networkit/components/StronglyConnectedComponents.hpp +0 -50
- package/vendor/include/networkit/components/WeaklyConnectedComponents.hpp +0 -59
- package/vendor/include/networkit/correlation/Assortativity.hpp +0 -64
- package/vendor/include/networkit/distance/APSP.hpp +0 -70
- package/vendor/include/networkit/distance/AStar.hpp +0 -68
- package/vendor/include/networkit/distance/AStarGeneral.hpp +0 -110
- package/vendor/include/networkit/distance/AdamicAdarDistance.hpp +0 -52
- package/vendor/include/networkit/distance/AffectedNodes.hpp +0 -130
- package/vendor/include/networkit/distance/AlgebraicDistance.hpp +0 -63
- package/vendor/include/networkit/distance/BFS.hpp +0 -43
- package/vendor/include/networkit/distance/BidirectionalBFS.hpp +0 -51
- package/vendor/include/networkit/distance/BidirectionalDijkstra.hpp +0 -69
- package/vendor/include/networkit/distance/CommuteTimeDistance.hpp +0 -89
- package/vendor/include/networkit/distance/Diameter.hpp +0 -97
- package/vendor/include/networkit/distance/Dijkstra.hpp +0 -50
- package/vendor/include/networkit/distance/DynAPSP.hpp +0 -67
- package/vendor/include/networkit/distance/DynBFS.hpp +0 -56
- package/vendor/include/networkit/distance/DynDijkstra.hpp +0 -57
- package/vendor/include/networkit/distance/DynPrunedLandmarkLabeling.hpp +0 -67
- package/vendor/include/networkit/distance/DynSSSP.hpp +0 -87
- package/vendor/include/networkit/distance/Eccentricity.hpp +0 -32
- package/vendor/include/networkit/distance/EffectiveDiameter.hpp +0 -47
- package/vendor/include/networkit/distance/EffectiveDiameterApproximation.hpp +0 -57
- package/vendor/include/networkit/distance/FloydWarshall.hpp +0 -93
- package/vendor/include/networkit/distance/GraphDistance.hpp +0 -49
- package/vendor/include/networkit/distance/HopPlotApproximation.hpp +0 -62
- package/vendor/include/networkit/distance/IncompleteDijkstra.hpp +0 -66
- package/vendor/include/networkit/distance/IncompleteSSSP.hpp +0 -41
- package/vendor/include/networkit/distance/JaccardDistance.hpp +0 -57
- package/vendor/include/networkit/distance/MultiTargetBFS.hpp +0 -32
- package/vendor/include/networkit/distance/MultiTargetDijkstra.hpp +0 -40
- package/vendor/include/networkit/distance/NeighborhoodFunction.hpp +0 -47
- package/vendor/include/networkit/distance/NeighborhoodFunctionApproximation.hpp +0 -56
- package/vendor/include/networkit/distance/NeighborhoodFunctionHeuristic.hpp +0 -56
- package/vendor/include/networkit/distance/NodeDistance.hpp +0 -54
- package/vendor/include/networkit/distance/PrunedLandmarkLabeling.hpp +0 -76
- package/vendor/include/networkit/distance/ReverseBFS.hpp +0 -46
- package/vendor/include/networkit/distance/SPSP.hpp +0 -143
- package/vendor/include/networkit/distance/SSSP.hpp +0 -216
- package/vendor/include/networkit/distance/STSP.hpp +0 -193
- package/vendor/include/networkit/distance/Volume.hpp +0 -66
- package/vendor/include/networkit/dynamics/DGSStreamParser.hpp +0 -40
- package/vendor/include/networkit/dynamics/DGSWriter.hpp +0 -30
- package/vendor/include/networkit/dynamics/GraphDifference.hpp +0 -110
- package/vendor/include/networkit/dynamics/GraphEvent.hpp +0 -55
- package/vendor/include/networkit/dynamics/GraphEventHandler.hpp +0 -39
- package/vendor/include/networkit/dynamics/GraphEventProxy.hpp +0 -55
- package/vendor/include/networkit/dynamics/GraphUpdater.hpp +0 -38
- package/vendor/include/networkit/edgescores/ChibaNishizekiQuadrangleEdgeScore.hpp +0 -26
- package/vendor/include/networkit/edgescores/ChibaNishizekiTriangleEdgeScore.hpp +0 -33
- package/vendor/include/networkit/edgescores/EdgeScore.hpp +0 -50
- package/vendor/include/networkit/edgescores/EdgeScoreAsWeight.hpp +0 -33
- package/vendor/include/networkit/edgescores/EdgeScoreBlender.hpp +0 -33
- package/vendor/include/networkit/edgescores/EdgeScoreLinearizer.hpp +0 -32
- package/vendor/include/networkit/edgescores/EdgeScoreNormalizer.hpp +0 -35
- package/vendor/include/networkit/edgescores/GeometricMeanScore.hpp +0 -29
- package/vendor/include/networkit/edgescores/PrefixJaccardScore.hpp +0 -23
- package/vendor/include/networkit/edgescores/TriangleEdgeScore.hpp +0 -39
- package/vendor/include/networkit/embedding/Node2Vec.hpp +0 -83
- package/vendor/include/networkit/flow/EdmondsKarp.hpp +0 -112
- package/vendor/include/networkit/generators/BarabasiAlbertGenerator.hpp +0 -87
- package/vendor/include/networkit/generators/ChungLuGenerator.hpp +0 -46
- package/vendor/include/networkit/generators/ChungLuGeneratorAlamEtAl.hpp +0 -63
- package/vendor/include/networkit/generators/ClusteredRandomGraphGenerator.hpp +0 -56
- package/vendor/include/networkit/generators/ConfigurationModel.hpp +0 -36
- package/vendor/include/networkit/generators/DorogovtsevMendesGenerator.hpp +0 -33
- package/vendor/include/networkit/generators/DynamicBarabasiAlbertGenerator.hpp +0 -33
- package/vendor/include/networkit/generators/DynamicDGSParser.hpp +0 -51
- package/vendor/include/networkit/generators/DynamicDorogovtsevMendesGenerator.hpp +0 -34
- package/vendor/include/networkit/generators/DynamicForestFireGenerator.hpp +0 -55
- package/vendor/include/networkit/generators/DynamicGraphGenerator.hpp +0 -40
- package/vendor/include/networkit/generators/DynamicGraphSource.hpp +0 -79
- package/vendor/include/networkit/generators/DynamicHyperbolicGenerator.hpp +0 -143
- package/vendor/include/networkit/generators/DynamicPathGenerator.hpp +0 -26
- package/vendor/include/networkit/generators/DynamicPubWebGenerator.hpp +0 -54
- package/vendor/include/networkit/generators/EdgeSwitchingMarkovChainGenerator.hpp +0 -65
- package/vendor/include/networkit/generators/ErdosRenyiEnumerator.hpp +0 -318
- package/vendor/include/networkit/generators/ErdosRenyiGenerator.hpp +0 -56
- package/vendor/include/networkit/generators/HavelHakimiGenerator.hpp +0 -48
- package/vendor/include/networkit/generators/HyperbolicGenerator.hpp +0 -236
- package/vendor/include/networkit/generators/LFRGenerator.hpp +0 -175
- package/vendor/include/networkit/generators/MocnikGenerator.hpp +0 -147
- package/vendor/include/networkit/generators/MocnikGeneratorBasic.hpp +0 -58
- package/vendor/include/networkit/generators/PowerlawDegreeSequence.hpp +0 -128
- package/vendor/include/networkit/generators/PubWebGenerator.hpp +0 -94
- package/vendor/include/networkit/generators/RegularRingLatticeGenerator.hpp +0 -37
- package/vendor/include/networkit/generators/RmatGenerator.hpp +0 -67
- package/vendor/include/networkit/generators/StaticDegreeSequenceGenerator.hpp +0 -42
- package/vendor/include/networkit/generators/StaticGraphGenerator.hpp +0 -30
- package/vendor/include/networkit/generators/StochasticBlockmodel.hpp +0 -41
- package/vendor/include/networkit/generators/WattsStrogatzGenerator.hpp +0 -43
- package/vendor/include/networkit/generators/quadtree/QuadNode.hpp +0 -857
- package/vendor/include/networkit/generators/quadtree/QuadNodeCartesianEuclid.hpp +0 -587
- package/vendor/include/networkit/generators/quadtree/QuadNodePolarEuclid.hpp +0 -726
- package/vendor/include/networkit/generators/quadtree/Quadtree.hpp +0 -232
- package/vendor/include/networkit/generators/quadtree/QuadtreeCartesianEuclid.hpp +0 -149
- package/vendor/include/networkit/generators/quadtree/QuadtreePolarEuclid.hpp +0 -143
- package/vendor/include/networkit/geometric/HyperbolicSpace.hpp +0 -248
- package/vendor/include/networkit/geometric/Point2DWithIndex.hpp +0 -145
- package/vendor/include/networkit/global/ClusteringCoefficient.hpp +0 -42
- package/vendor/include/networkit/global/GlobalClusteringCoefficient.hpp +0 -24
- package/vendor/include/networkit/graph/Attributes.hpp +0 -568
- package/vendor/include/networkit/graph/BFS.hpp +0 -111
- package/vendor/include/networkit/graph/DFS.hpp +0 -71
- package/vendor/include/networkit/graph/Dijkstra.hpp +0 -83
- package/vendor/include/networkit/graph/EdgeIterators.hpp +0 -171
- package/vendor/include/networkit/graph/Graph.hpp +0 -2083
- package/vendor/include/networkit/graph/GraphBuilder.hpp +0 -289
- package/vendor/include/networkit/graph/GraphR.hpp +0 -133
- package/vendor/include/networkit/graph/GraphTools.hpp +0 -589
- package/vendor/include/networkit/graph/GraphW.hpp +0 -1236
- package/vendor/include/networkit/graph/KruskalMSF.hpp +0 -50
- package/vendor/include/networkit/graph/NeighborIterators.hpp +0 -163
- package/vendor/include/networkit/graph/NodeIterators.hpp +0 -127
- package/vendor/include/networkit/graph/PrimMSF.hpp +0 -66
- package/vendor/include/networkit/graph/RandomMaximumSpanningForest.hpp +0 -133
- package/vendor/include/networkit/graph/SpanningForest.hpp +0 -41
- package/vendor/include/networkit/graph/TopologicalSort.hpp +0 -87
- package/vendor/include/networkit/graph/UnionMaximumSpanningForest.hpp +0 -126
- package/vendor/include/networkit/graph/test/GraphBuilderBenchmark.hpp +0 -68
- package/vendor/include/networkit/independentset/IndependentSetFinder.hpp +0 -44
- package/vendor/include/networkit/independentset/Luby.hpp +0 -27
- package/vendor/include/networkit/io/BinaryEdgeListPartitionReader.hpp +0 -45
- package/vendor/include/networkit/io/BinaryEdgeListPartitionWriter.hpp +0 -47
- package/vendor/include/networkit/io/BinaryPartitionReader.hpp +0 -41
- package/vendor/include/networkit/io/BinaryPartitionWriter.hpp +0 -44
- package/vendor/include/networkit/io/CoverReader.hpp +0 -27
- package/vendor/include/networkit/io/CoverWriter.hpp +0 -21
- package/vendor/include/networkit/io/DGSReader.hpp +0 -39
- package/vendor/include/networkit/io/DibapGraphReader.hpp +0 -43
- package/vendor/include/networkit/io/DotGraphWriter.hpp +0 -39
- package/vendor/include/networkit/io/DotPartitionWriter.hpp +0 -23
- package/vendor/include/networkit/io/DynamicGraphReader.hpp +0 -29
- package/vendor/include/networkit/io/EdgeListCoverReader.hpp +0 -35
- package/vendor/include/networkit/io/EdgeListPartitionReader.hpp +0 -43
- package/vendor/include/networkit/io/EdgeListReader.hpp +0 -61
- package/vendor/include/networkit/io/EdgeListWriter.hpp +0 -48
- package/vendor/include/networkit/io/GMLGraphReader.hpp +0 -33
- package/vendor/include/networkit/io/GMLGraphWriter.hpp +0 -33
- package/vendor/include/networkit/io/GraphIO.hpp +0 -52
- package/vendor/include/networkit/io/GraphReader.hpp +0 -40
- package/vendor/include/networkit/io/GraphToolBinaryReader.hpp +0 -71
- package/vendor/include/networkit/io/GraphToolBinaryWriter.hpp +0 -61
- package/vendor/include/networkit/io/GraphWriter.hpp +0 -27
- package/vendor/include/networkit/io/KONECTGraphReader.hpp +0 -44
- package/vendor/include/networkit/io/LineFileReader.hpp +0 -42
- package/vendor/include/networkit/io/METISGraphReader.hpp +0 -36
- package/vendor/include/networkit/io/METISGraphWriter.hpp +0 -29
- package/vendor/include/networkit/io/METISParser.hpp +0 -63
- package/vendor/include/networkit/io/MTXGraphReader.hpp +0 -31
- package/vendor/include/networkit/io/MTXParser.hpp +0 -87
- package/vendor/include/networkit/io/MatrixMarketReader.hpp +0 -33
- package/vendor/include/networkit/io/MatrixReader.hpp +0 -33
- package/vendor/include/networkit/io/MemoryMappedFile.hpp +0 -80
- package/vendor/include/networkit/io/NetworkitBinaryGraph.hpp +0 -144
- package/vendor/include/networkit/io/NetworkitBinaryReader.hpp +0 -50
- package/vendor/include/networkit/io/NetworkitBinaryWriter.hpp +0 -71
- package/vendor/include/networkit/io/PartitionReader.hpp +0 -34
- package/vendor/include/networkit/io/PartitionWriter.hpp +0 -31
- package/vendor/include/networkit/io/RBGraphReader.hpp +0 -37
- package/vendor/include/networkit/io/RBMatrixReader.hpp +0 -49
- package/vendor/include/networkit/io/RasterReader.hpp +0 -40
- package/vendor/include/networkit/io/SNAPEdgeListPartitionReader.hpp +0 -28
- package/vendor/include/networkit/io/SNAPGraphReader.hpp +0 -53
- package/vendor/include/networkit/io/SNAPGraphWriter.hpp +0 -53
- package/vendor/include/networkit/io/ThrillGraphBinaryReader.hpp +0 -44
- package/vendor/include/networkit/io/ThrillGraphBinaryWriter.hpp +0 -27
- package/vendor/include/networkit/layout/LayoutAlgorithm.hpp +0 -39
- package/vendor/include/networkit/linkprediction/AdamicAdarIndex.hpp +0 -37
- package/vendor/include/networkit/linkprediction/AdjustedRandIndex.hpp +0 -36
- package/vendor/include/networkit/linkprediction/AlgebraicDistanceIndex.hpp +0 -70
- package/vendor/include/networkit/linkprediction/CommonNeighborsIndex.hpp +0 -39
- package/vendor/include/networkit/linkprediction/EvaluationMetric.hpp +0 -135
- package/vendor/include/networkit/linkprediction/JaccardIndex.hpp +0 -44
- package/vendor/include/networkit/linkprediction/KatzIndex.hpp +0 -84
- package/vendor/include/networkit/linkprediction/LinkPredictor.hpp +0 -98
- package/vendor/include/networkit/linkprediction/LinkThresholder.hpp +0 -56
- package/vendor/include/networkit/linkprediction/MissingLinksFinder.hpp +0 -60
- package/vendor/include/networkit/linkprediction/NeighborhoodDistanceIndex.hpp +0 -42
- package/vendor/include/networkit/linkprediction/NeighborhoodUtility.hpp +0 -54
- package/vendor/include/networkit/linkprediction/NeighborsMeasureIndex.hpp +0 -48
- package/vendor/include/networkit/linkprediction/PrecisionRecallMetric.hpp +0 -40
- package/vendor/include/networkit/linkprediction/PredictionsSorter.hpp +0 -66
- package/vendor/include/networkit/linkprediction/PreferentialAttachmentIndex.hpp +0 -37
- package/vendor/include/networkit/linkprediction/ROCMetric.hpp +0 -39
- package/vendor/include/networkit/linkprediction/RandomLinkSampler.hpp +0 -47
- package/vendor/include/networkit/linkprediction/ResourceAllocationIndex.hpp +0 -38
- package/vendor/include/networkit/linkprediction/SameCommunityIndex.hpp +0 -50
- package/vendor/include/networkit/linkprediction/TotalNeighborsIndex.hpp +0 -39
- package/vendor/include/networkit/linkprediction/UDegreeIndex.hpp +0 -35
- package/vendor/include/networkit/linkprediction/VDegreeIndex.hpp +0 -35
- package/vendor/include/networkit/matching/BMatcher.hpp +0 -52
- package/vendor/include/networkit/matching/BMatching.hpp +0 -115
- package/vendor/include/networkit/matching/BSuitorMatcher.hpp +0 -170
- package/vendor/include/networkit/matching/DynamicBSuitorMatcher.hpp +0 -78
- package/vendor/include/networkit/matching/LocalMaxMatcher.hpp +0 -35
- package/vendor/include/networkit/matching/Matcher.hpp +0 -55
- package/vendor/include/networkit/matching/Matching.hpp +0 -111
- package/vendor/include/networkit/matching/PathGrowingMatcher.hpp +0 -46
- package/vendor/include/networkit/matching/SuitorMatcher.hpp +0 -62
- package/vendor/include/networkit/numerics/ConjugateGradient.hpp +0 -163
- package/vendor/include/networkit/numerics/GaussSeidelRelaxation.hpp +0 -99
- package/vendor/include/networkit/numerics/LAMG/LAMGSettings.hpp +0 -70
- package/vendor/include/networkit/numerics/LAMG/Lamg.hpp +0 -460
- package/vendor/include/networkit/numerics/LAMG/Level/EliminationStage.hpp +0 -47
- package/vendor/include/networkit/numerics/LAMG/Level/Level.hpp +0 -56
- package/vendor/include/networkit/numerics/LAMG/Level/LevelAggregation.hpp +0 -52
- package/vendor/include/networkit/numerics/LAMG/Level/LevelElimination.hpp +0 -133
- package/vendor/include/networkit/numerics/LAMG/Level/LevelFinest.hpp +0 -28
- package/vendor/include/networkit/numerics/LAMG/LevelHierarchy.hpp +0 -165
- package/vendor/include/networkit/numerics/LAMG/MultiLevelSetup.hpp +0 -1090
- package/vendor/include/networkit/numerics/LAMG/SolverLamg.hpp +0 -316
- package/vendor/include/networkit/numerics/LinearSolver.hpp +0 -151
- package/vendor/include/networkit/numerics/Preconditioner/DiagonalPreconditioner.hpp +0 -61
- package/vendor/include/networkit/numerics/Preconditioner/IdentityPreconditioner.hpp +0 -36
- package/vendor/include/networkit/numerics/Smoother.hpp +0 -37
- package/vendor/include/networkit/overlap/HashingOverlapper.hpp +0 -28
- package/vendor/include/networkit/overlap/Overlapper.hpp +0 -27
- package/vendor/include/networkit/planarity/LeftRightPlanarityCheck.hpp +0 -113
- package/vendor/include/networkit/randomization/Curveball.hpp +0 -49
- package/vendor/include/networkit/randomization/CurveballGlobalTradeGenerator.hpp +0 -39
- package/vendor/include/networkit/randomization/CurveballUniformTradeGenerator.hpp +0 -39
- package/vendor/include/networkit/randomization/DegreePreservingShuffle.hpp +0 -82
- package/vendor/include/networkit/randomization/EdgeSwitching.hpp +0 -157
- package/vendor/include/networkit/randomization/GlobalCurveball.hpp +0 -69
- package/vendor/include/networkit/randomization/GlobalTradeSequence.hpp +0 -303
- package/vendor/include/networkit/reachability/AllSimplePaths.hpp +0 -122
- package/vendor/include/networkit/reachability/ReachableNodes.hpp +0 -83
- package/vendor/include/networkit/scd/ApproximatePageRank.hpp +0 -51
- package/vendor/include/networkit/scd/CliqueDetect.hpp +0 -55
- package/vendor/include/networkit/scd/CombinedSCD.hpp +0 -51
- package/vendor/include/networkit/scd/GCE.hpp +0 -42
- package/vendor/include/networkit/scd/LFMLocal.hpp +0 -54
- package/vendor/include/networkit/scd/LocalT.hpp +0 -40
- package/vendor/include/networkit/scd/LocalTightnessExpansion.hpp +0 -46
- package/vendor/include/networkit/scd/PageRankNibble.hpp +0 -55
- package/vendor/include/networkit/scd/RandomBFS.hpp +0 -33
- package/vendor/include/networkit/scd/SCDGroundTruthComparison.hpp +0 -121
- package/vendor/include/networkit/scd/SelectiveCommunityDetector.hpp +0 -76
- package/vendor/include/networkit/scd/SetConductance.hpp +0 -47
- package/vendor/include/networkit/scd/TCE.hpp +0 -41
- package/vendor/include/networkit/scd/TwoPhaseL.hpp +0 -40
- package/vendor/include/networkit/scoring/EdgeScoring.hpp +0 -44
- package/vendor/include/networkit/scoring/ModularityScoring.hpp +0 -79
- package/vendor/include/networkit/simulation/EpidemicSimulationSEIR.hpp +0 -59
- package/vendor/include/networkit/sparsification/ChanceCorrectedTriangleScore.hpp +0 -28
- package/vendor/include/networkit/sparsification/ForestFireScore.hpp +0 -34
- package/vendor/include/networkit/sparsification/GlobalThresholdFilter.hpp +0 -40
- package/vendor/include/networkit/sparsification/LocalDegreeScore.hpp +0 -30
- package/vendor/include/networkit/sparsification/LocalFilterScore.hpp +0 -124
- package/vendor/include/networkit/sparsification/LocalSimilarityScore.hpp +0 -63
- package/vendor/include/networkit/sparsification/MultiscaleScore.hpp +0 -38
- package/vendor/include/networkit/sparsification/RandomEdgeScore.hpp +0 -33
- package/vendor/include/networkit/sparsification/RandomNodeEdgeScore.hpp +0 -29
- package/vendor/include/networkit/sparsification/SCANStructuralSimilarityScore.hpp +0 -23
- package/vendor/include/networkit/sparsification/SimmelianOverlapScore.hpp +0 -35
- package/vendor/include/networkit/sparsification/SimmelianScore.hpp +0 -92
- package/vendor/include/networkit/sparsification/Sparsifiers.hpp +0 -166
- package/vendor/include/networkit/structures/Cover.hpp +0 -248
- package/vendor/include/networkit/structures/LocalCommunity.hpp +0 -363
- package/vendor/include/networkit/structures/Partition.hpp +0 -335
- package/vendor/include/networkit/structures/UnionFind.hpp +0 -66
- package/vendor/include/networkit/viz/GraphLayoutAlgorithm.hpp +0 -157
- package/vendor/include/networkit/viz/MaxentStress.hpp +0 -346
- package/vendor/include/networkit/viz/Octree.hpp +0 -428
- package/vendor/include/networkit/viz/PivotMDS.hpp +0 -63
- package/vendor/include/networkit/viz/Point.hpp +0 -415
- package/vendor/include/networkit/viz/PostscriptWriter.hpp +0 -78
- package/vendor/include/tlx/algorithm/exclusive_scan.hpp +0 -56
- package/vendor/include/tlx/algorithm/is_sorted_cmp.hpp +0 -56
- package/vendor/include/tlx/algorithm/merge_advance.hpp +0 -177
- package/vendor/include/tlx/algorithm/merge_combine.hpp +0 -76
- package/vendor/include/tlx/algorithm/multisequence_partition.hpp +0 -346
- package/vendor/include/tlx/algorithm/multisequence_selection.hpp +0 -351
- package/vendor/include/tlx/algorithm/multiway_merge.hpp +0 -1385
- package/vendor/include/tlx/algorithm/multiway_merge_splitting.hpp +0 -257
- package/vendor/include/tlx/algorithm/parallel_multiway_merge.hpp +0 -408
- package/vendor/include/tlx/algorithm/random_bipartition_shuffle.hpp +0 -116
- package/vendor/include/tlx/algorithm.hpp +0 -36
- package/vendor/include/tlx/allocator_base.hpp +0 -100
- package/vendor/include/tlx/backtrace.hpp +0 -54
- package/vendor/include/tlx/cmdline_parser.hpp +0 -498
- package/vendor/include/tlx/container/btree.hpp +0 -3977
- package/vendor/include/tlx/container/btree_map.hpp +0 -634
- package/vendor/include/tlx/container/btree_multimap.hpp +0 -627
- package/vendor/include/tlx/container/btree_multiset.hpp +0 -612
- package/vendor/include/tlx/container/btree_set.hpp +0 -612
- package/vendor/include/tlx/container/d_ary_addressable_int_heap.hpp +0 -416
- package/vendor/include/tlx/container/d_ary_heap.hpp +0 -311
- package/vendor/include/tlx/container/loser_tree.hpp +0 -1009
- package/vendor/include/tlx/container/lru_cache.hpp +0 -319
- package/vendor/include/tlx/container/radix_heap.hpp +0 -735
- package/vendor/include/tlx/container/ring_buffer.hpp +0 -428
- package/vendor/include/tlx/container/simple_vector.hpp +0 -304
- package/vendor/include/tlx/container/splay_tree.hpp +0 -399
- package/vendor/include/tlx/container/string_view.hpp +0 -805
- package/vendor/include/tlx/container.hpp +0 -40
- package/vendor/include/tlx/counting_ptr.hpp +0 -522
- package/vendor/include/tlx/define/attribute_always_inline.hpp +0 -34
- package/vendor/include/tlx/define/attribute_fallthrough.hpp +0 -36
- package/vendor/include/tlx/define/attribute_format_printf.hpp +0 -34
- package/vendor/include/tlx/define/attribute_packed.hpp +0 -34
- package/vendor/include/tlx/define/attribute_warn_unused_result.hpp +0 -34
- package/vendor/include/tlx/define/constexpr.hpp +0 -31
- package/vendor/include/tlx/define/deprecated.hpp +0 -39
- package/vendor/include/tlx/define/endian.hpp +0 -49
- package/vendor/include/tlx/define/likely.hpp +0 -33
- package/vendor/include/tlx/define/visibility_hidden.hpp +0 -34
- package/vendor/include/tlx/define.hpp +0 -36
- package/vendor/include/tlx/delegate.hpp +0 -524
- package/vendor/include/tlx/die/core.hpp +0 -311
- package/vendor/include/tlx/die.hpp +0 -106
- package/vendor/include/tlx/digest/md5.hpp +0 -81
- package/vendor/include/tlx/digest/sha1.hpp +0 -81
- package/vendor/include/tlx/digest/sha256.hpp +0 -81
- package/vendor/include/tlx/digest/sha512.hpp +0 -81
- package/vendor/include/tlx/digest.hpp +0 -30
- package/vendor/include/tlx/logger/all.hpp +0 -33
- package/vendor/include/tlx/logger/array.hpp +0 -43
- package/vendor/include/tlx/logger/core.hpp +0 -287
- package/vendor/include/tlx/logger/deque.hpp +0 -42
- package/vendor/include/tlx/logger/map.hpp +0 -65
- package/vendor/include/tlx/logger/set.hpp +0 -60
- package/vendor/include/tlx/logger/tuple.hpp +0 -66
- package/vendor/include/tlx/logger/unordered_map.hpp +0 -68
- package/vendor/include/tlx/logger/unordered_set.hpp +0 -64
- package/vendor/include/tlx/logger/wrap_unprintable.hpp +0 -75
- package/vendor/include/tlx/logger.hpp +0 -44
- package/vendor/include/tlx/math/abs_diff.hpp +0 -35
- package/vendor/include/tlx/math/aggregate.hpp +0 -231
- package/vendor/include/tlx/math/aggregate_min_max.hpp +0 -116
- package/vendor/include/tlx/math/bswap.hpp +0 -148
- package/vendor/include/tlx/math/bswap_be.hpp +0 -79
- package/vendor/include/tlx/math/bswap_le.hpp +0 -79
- package/vendor/include/tlx/math/clz.hpp +0 -174
- package/vendor/include/tlx/math/ctz.hpp +0 -174
- package/vendor/include/tlx/math/div_ceil.hpp +0 -36
- package/vendor/include/tlx/math/ffs.hpp +0 -123
- package/vendor/include/tlx/math/integer_log2.hpp +0 -189
- package/vendor/include/tlx/math/is_power_of_two.hpp +0 -74
- package/vendor/include/tlx/math/polynomial_regression.hpp +0 -243
- package/vendor/include/tlx/math/popcount.hpp +0 -173
- package/vendor/include/tlx/math/power_to_the.hpp +0 -44
- package/vendor/include/tlx/math/rol.hpp +0 -112
- package/vendor/include/tlx/math/ror.hpp +0 -112
- package/vendor/include/tlx/math/round_to_power_of_two.hpp +0 -121
- package/vendor/include/tlx/math/round_up.hpp +0 -36
- package/vendor/include/tlx/math/sgn.hpp +0 -38
- package/vendor/include/tlx/math.hpp +0 -46
- package/vendor/include/tlx/meta/apply_tuple.hpp +0 -55
- package/vendor/include/tlx/meta/call_for_range.hpp +0 -78
- package/vendor/include/tlx/meta/call_foreach.hpp +0 -60
- package/vendor/include/tlx/meta/call_foreach_tuple.hpp +0 -60
- package/vendor/include/tlx/meta/call_foreach_tuple_with_index.hpp +0 -61
- package/vendor/include/tlx/meta/call_foreach_with_index.hpp +0 -64
- package/vendor/include/tlx/meta/enable_if.hpp +0 -37
- package/vendor/include/tlx/meta/fold_left.hpp +0 -63
- package/vendor/include/tlx/meta/fold_left_tuple.hpp +0 -60
- package/vendor/include/tlx/meta/fold_right.hpp +0 -63
- package/vendor/include/tlx/meta/fold_right_tuple.hpp +0 -60
- package/vendor/include/tlx/meta/function_chain.hpp +0 -197
- package/vendor/include/tlx/meta/function_stack.hpp +0 -189
- package/vendor/include/tlx/meta/has_member.hpp +0 -80
- package/vendor/include/tlx/meta/has_method.hpp +0 -117
- package/vendor/include/tlx/meta/index_sequence.hpp +0 -66
- package/vendor/include/tlx/meta/is_std_array.hpp +0 -40
- package/vendor/include/tlx/meta/is_std_pair.hpp +0 -39
- package/vendor/include/tlx/meta/is_std_tuple.hpp +0 -39
- package/vendor/include/tlx/meta/is_std_vector.hpp +0 -39
- package/vendor/include/tlx/meta/log2.hpp +0 -101
- package/vendor/include/tlx/meta/no_operation.hpp +0 -55
- package/vendor/include/tlx/meta/static_index.hpp +0 -42
- package/vendor/include/tlx/meta/vexpand.hpp +0 -34
- package/vendor/include/tlx/meta/vmap_for_range.hpp +0 -84
- package/vendor/include/tlx/meta/vmap_foreach.hpp +0 -63
- package/vendor/include/tlx/meta/vmap_foreach_tuple.hpp +0 -59
- package/vendor/include/tlx/meta/vmap_foreach_tuple_with_index.hpp +0 -62
- package/vendor/include/tlx/meta/vmap_foreach_with_index.hpp +0 -70
- package/vendor/include/tlx/meta.hpp +0 -55
- package/vendor/include/tlx/multi_timer.hpp +0 -148
- package/vendor/include/tlx/port/setenv.hpp +0 -31
- package/vendor/include/tlx/port.hpp +0 -27
- package/vendor/include/tlx/semaphore.hpp +0 -119
- package/vendor/include/tlx/simple_vector.hpp +0 -20
- package/vendor/include/tlx/siphash.hpp +0 -282
- package/vendor/include/tlx/sort/networks/best.hpp +0 -611
- package/vendor/include/tlx/sort/networks/bose_nelson.hpp +0 -412
- package/vendor/include/tlx/sort/networks/bose_nelson_parameter.hpp +0 -507
- package/vendor/include/tlx/sort/networks/cswap.hpp +0 -60
- package/vendor/include/tlx/sort/parallel_mergesort.hpp +0 -398
- package/vendor/include/tlx/sort/strings/insertion_sort.hpp +0 -232
- package/vendor/include/tlx/sort/strings/multikey_quicksort.hpp +0 -185
- package/vendor/include/tlx/sort/strings/parallel_sample_sort.hpp +0 -1647
- package/vendor/include/tlx/sort/strings/radix_sort.hpp +0 -934
- package/vendor/include/tlx/sort/strings/sample_sort_tools.hpp +0 -756
- package/vendor/include/tlx/sort/strings/string_ptr.hpp +0 -426
- package/vendor/include/tlx/sort/strings/string_set.hpp +0 -800
- package/vendor/include/tlx/sort/strings.hpp +0 -329
- package/vendor/include/tlx/sort/strings_parallel.hpp +0 -325
- package/vendor/include/tlx/sort.hpp +0 -29
- package/vendor/include/tlx/stack_allocator.hpp +0 -226
- package/vendor/include/tlx/string/appendline.hpp +0 -35
- package/vendor/include/tlx/string/base64.hpp +0 -87
- package/vendor/include/tlx/string/bitdump.hpp +0 -139
- package/vendor/include/tlx/string/compare_icase.hpp +0 -42
- package/vendor/include/tlx/string/contains.hpp +0 -36
- package/vendor/include/tlx/string/contains_word.hpp +0 -42
- package/vendor/include/tlx/string/ends_with.hpp +0 -79
- package/vendor/include/tlx/string/equal_icase.hpp +0 -42
- package/vendor/include/tlx/string/erase_all.hpp +0 -70
- package/vendor/include/tlx/string/escape_html.hpp +0 -34
- package/vendor/include/tlx/string/escape_uri.hpp +0 -34
- package/vendor/include/tlx/string/expand_environment_variables.hpp +0 -49
- package/vendor/include/tlx/string/extract_between.hpp +0 -40
- package/vendor/include/tlx/string/format_iec_units.hpp +0 -32
- package/vendor/include/tlx/string/format_si_iec_units.hpp +0 -19
- package/vendor/include/tlx/string/format_si_units.hpp +0 -32
- package/vendor/include/tlx/string/hash_djb2.hpp +0 -87
- package/vendor/include/tlx/string/hash_sdbm.hpp +0 -86
- package/vendor/include/tlx/string/hexdump.hpp +0 -154
- package/vendor/include/tlx/string/index_of.hpp +0 -56
- package/vendor/include/tlx/string/join.hpp +0 -65
- package/vendor/include/tlx/string/join_generic.hpp +0 -89
- package/vendor/include/tlx/string/join_quoted.hpp +0 -46
- package/vendor/include/tlx/string/less_icase.hpp +0 -64
- package/vendor/include/tlx/string/levenshtein.hpp +0 -193
- package/vendor/include/tlx/string/pad.hpp +0 -39
- package/vendor/include/tlx/string/parse_si_iec_units.hpp +0 -46
- package/vendor/include/tlx/string/parse_uri.hpp +0 -66
- package/vendor/include/tlx/string/parse_uri_form_data.hpp +0 -136
- package/vendor/include/tlx/string/replace.hpp +0 -141
- package/vendor/include/tlx/string/split.hpp +0 -170
- package/vendor/include/tlx/string/split_quoted.hpp +0 -49
- package/vendor/include/tlx/string/split_view.hpp +0 -218
- package/vendor/include/tlx/string/split_words.hpp +0 -53
- package/vendor/include/tlx/string/ssprintf.hpp +0 -45
- package/vendor/include/tlx/string/ssprintf_generic.hpp +0 -95
- package/vendor/include/tlx/string/starts_with.hpp +0 -44
- package/vendor/include/tlx/string/to_lower.hpp +0 -47
- package/vendor/include/tlx/string/to_upper.hpp +0 -47
- package/vendor/include/tlx/string/trim.hpp +0 -298
- package/vendor/include/tlx/string/union_words.hpp +0 -33
- package/vendor/include/tlx/string/word_wrap.hpp +0 -35
- package/vendor/include/tlx/string.hpp +0 -68
- package/vendor/include/tlx/thread_barrier_mutex.hpp +0 -109
- package/vendor/include/tlx/thread_barrier_spin.hpp +0 -127
- package/vendor/include/tlx/thread_pool.hpp +0 -151
- package/vendor/include/tlx/timestamp.hpp +0 -23
- package/vendor/include/tlx/unused.hpp +0 -28
- package/vendor/include/tlx/vector_free.hpp +0 -30
- package/vendor/include/tlx/version.hpp +0 -49
- package/vendor/include/ttmath/ttmath.h +0 -2881
- package/vendor/include/ttmath/ttmathbig.h +0 -6111
- package/vendor/include/ttmath/ttmathdec.h +0 -419
- package/vendor/include/ttmath/ttmathint.h +0 -1923
- package/vendor/include/ttmath/ttmathmisc.h +0 -250
- package/vendor/include/ttmath/ttmathobjects.h +0 -812
- package/vendor/include/ttmath/ttmathparser.h +0 -2791
- package/vendor/include/ttmath/ttmaththreads.h +0 -252
- package/vendor/include/ttmath/ttmathtypes.h +0 -707
- package/vendor/include/ttmath/ttmathuint.h +0 -4190
- package/vendor/include/ttmath/ttmathuint_noasm.h +0 -1038
- package/vendor/include/ttmath/ttmathuint_x86.h +0 -1620
- package/vendor/include/ttmath/ttmathuint_x86_64.h +0 -1177
- package/vendor/lib/cmake/tlx/tlx-config.cmake +0 -51
- package/vendor/lib/cmake/tlx/tlx-targets-release.cmake +0 -19
- package/vendor/lib/cmake/tlx/tlx-targets.cmake +0 -106
- package/vendor/lib/cmake/tlx/tlx-version.cmake +0 -11
- package/vendor/lib/libtlx.a +0 -0
- package/vendor/lib/pkgconfig/networkit.pc +0 -11
- package/vendor/lib/pkgconfig/tlx.pc +0 -11
|
@@ -1,1090 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* MultiLevelSetup.hpp
|
|
3
|
-
*
|
|
4
|
-
* Created on: 10.01.2015
|
|
5
|
-
* Author: Michael Wegner
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
#ifndef NETWORKIT_NUMERICS_LAMG_MULTI_LEVEL_SETUP_HPP_
|
|
9
|
-
#define NETWORKIT_NUMERICS_LAMG_MULTI_LEVEL_SETUP_HPP_
|
|
10
|
-
|
|
11
|
-
#include <networkit/algebraic/CSRMatrix.hpp>
|
|
12
|
-
#include <networkit/algebraic/DenseMatrix.hpp>
|
|
13
|
-
#include <networkit/algebraic/DynamicMatrix.hpp>
|
|
14
|
-
#include <networkit/numerics/LAMG/LevelHierarchy.hpp>
|
|
15
|
-
#include <networkit/numerics/Smoother.hpp>
|
|
16
|
-
|
|
17
|
-
#include <cmath>
|
|
18
|
-
#include <limits>
|
|
19
|
-
#include <vector>
|
|
20
|
-
|
|
21
|
-
namespace NetworKit {
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @ingroup
|
|
25
|
-
* Implements the setup phase of LAMG (Lean Algebraic Multigrid by Livne et al.).
|
|
26
|
-
*/
|
|
27
|
-
template <class Matrix>
|
|
28
|
-
class MultiLevelSetup {
|
|
29
|
-
|
|
30
|
-
#define UNDECIDED std::numeric_limits<index>::max()
|
|
31
|
-
|
|
32
|
-
private:
|
|
33
|
-
const Smoother<Matrix> &smoother;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Elimination phase of LAMG for the specified Laplacian matrix @a matrix. If an elemination
|
|
37
|
-
* stage is created, it is stored in the LevelHierarchy @a hierarchy and the method returns
|
|
38
|
-
* @code{true}. Otherwise, @code{false} is returned.
|
|
39
|
-
* @param matrix Laplacian matrix for which an elimination stage should be created.
|
|
40
|
-
* @param hierarchy LevelHierarchy in which the created elimination stage is stored (if created)
|
|
41
|
-
* @return @code{True} if an elimination stage has been created, otherwise@code{false}.
|
|
42
|
-
*/
|
|
43
|
-
bool coarseningElimination(Matrix &matrix, LevelHierarchy<Matrix> &hierarchy) const;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Scans the Laplacian matrix for nodes with a low degree (i.e. nodes with less than 5
|
|
47
|
-
* neighbors). For each node having low degree and independent from already found low degree
|
|
48
|
-
* nodes, @code{true} is stored in @a fNode. The
|
|
49
|
-
* @a stage parameter specifies if we are in the first or subsequent stages during elimination.
|
|
50
|
-
* @param matrix Laplacian matrix.
|
|
51
|
-
* @param fNode[out] For each node, @code{true} if the node is of low degree and @code{false}
|
|
52
|
-
* otherwise.
|
|
53
|
-
* @param stage The stage of the elimination phase.
|
|
54
|
-
* @return Number of low degree nodes found.
|
|
55
|
-
*/
|
|
56
|
-
count lowDegreeSweep(const Matrix &matrix, std::vector<bool> &fNode, index stage) const;
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Computes the projection matrix @a P and the @a q vector used to restrict and interpolate the
|
|
60
|
-
* matrix for an elimination stage.
|
|
61
|
-
* @param matrix Laplacian matrix.
|
|
62
|
-
* @param fSet Set of nodes having low degree.
|
|
63
|
-
* @param coarseIndex Set of nodes equal to V \setminus fSet
|
|
64
|
-
* @param P[out] The projection matrix.
|
|
65
|
-
* @param q[out] The q vector.
|
|
66
|
-
*/
|
|
67
|
-
void eliminationOperators(const Matrix &matrix, const std::vector<index> &fSet,
|
|
68
|
-
const std::vector<index> &coarseIndex, Matrix &P, Vector &q) const;
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Aggregation phase of LAMG for the specified Laplacian matrix @a matrix. The coarsened matrix
|
|
72
|
-
* is stored in the LevelHierarchy @a hierarchy. The test vector @a tv is used for determining
|
|
73
|
-
* the affinity of nodes. The parameter
|
|
74
|
-
* @a numTVVectors specifies how many test vectors will be created to determine the affinities
|
|
75
|
-
* between nodes.
|
|
76
|
-
* @param matrix Laplacian matrix.
|
|
77
|
-
* @param hierarchy LevelHierarchy to store the stage.
|
|
78
|
-
* @param tv Test vector.
|
|
79
|
-
* @param numTVVectors Number of test vectors to use.
|
|
80
|
-
*/
|
|
81
|
-
void coarseningAggregation(Matrix &matrix, LevelHierarchy<Matrix> &hierarchy, Vector &tv,
|
|
82
|
-
count numTVVectors) const;
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Create @a numVectors test vectors for the given Laplacian matrix @a matrix. The test vector
|
|
86
|
-
* @a tv will be reused.
|
|
87
|
-
* @param matrix Laplacian matrix.
|
|
88
|
-
* @param tv Test vector.
|
|
89
|
-
* @param numVectors Number of test vectors to create.
|
|
90
|
-
* @return The created test vectors.
|
|
91
|
-
*/
|
|
92
|
-
std::vector<Vector> generateTVs(const Matrix &matrix, Vector &tv, count numVectors) const;
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Adds high degree nodes as seeds to @a status.
|
|
96
|
-
* @param matrix Laplacian matrix.
|
|
97
|
-
* @param status[out] High degree nodes are flagged as seed.
|
|
98
|
-
*/
|
|
99
|
-
void addHighDegreeSeedNodes(const Matrix &matrix, std::vector<index> &status) const;
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Aggregates loose nodes (nodes with low adjacency) together.
|
|
103
|
-
* @param strongAdjMatrix Strong adjacency matrix.
|
|
104
|
-
* @param status[out] Aggregates loose nodes together and labels them in @a status accordingly.
|
|
105
|
-
* @param nc[out] The altered number of coarse nodes.
|
|
106
|
-
*/
|
|
107
|
-
void aggregateLooseNodes(const Matrix &strongAdjMatrix, std::vector<index> &status,
|
|
108
|
-
count &nc) const;
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Computes the strong adjacency matrix for the given Laplacian matrix @a matrix.
|
|
112
|
-
* @param matrix Laplacian matrix.
|
|
113
|
-
* @param strongAdjMatrix[out] The resulting strong adjacency matrix.
|
|
114
|
-
*/
|
|
115
|
-
void computeStrongAdjacencyMatrix(const Matrix &matrix, Matrix &strongAdjMatrix) const;
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Computes the affinity matrix for the given Laplacian matrix @a matrix and the test vectors @a
|
|
119
|
-
* tVs.
|
|
120
|
-
* @param matrix Laplacian matrix.
|
|
121
|
-
* @param tVs Test vectors.
|
|
122
|
-
* @param affinityMatrix[out] The resulting affinity matrix.
|
|
123
|
-
*/
|
|
124
|
-
void computeAffinityMatrix(const Matrix &matrix, const std::vector<Vector> &tVs,
|
|
125
|
-
Matrix &affinityMatrix) const;
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Models one stage in the aggregation phase. New aggregates are labeled accordingly in @a
|
|
129
|
-
* status.
|
|
130
|
-
* @param matrix Laplacian matrix.
|
|
131
|
-
* @param nc Number of coarse nodes.
|
|
132
|
-
* @param strongAdjMatrix Strong adjacency matrix.
|
|
133
|
-
* @param affinityMatrix Affinity matrix.
|
|
134
|
-
* @param tVs[out] Test vectors.
|
|
135
|
-
* @param status[out] Aggregation labels.
|
|
136
|
-
*/
|
|
137
|
-
void aggregationStage(const Matrix &matrix, count &nc, const Matrix &strongAdjMatrix,
|
|
138
|
-
const Matrix &affinityMatrix, std::vector<Vector> &tVs,
|
|
139
|
-
std::vector<index> &status) const;
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Computes strong (cf. LAMG paper) neighbors and stores them sorted into @a bins.
|
|
143
|
-
* @param affinityMatrix Affinity matrix.
|
|
144
|
-
* @param status Aggregation labels.
|
|
145
|
-
* @param bins[out] Strong neighbors sorted into bins.
|
|
146
|
-
*/
|
|
147
|
-
void computeStrongNeighbors(const Matrix &affinityMatrix, const std::vector<index> &status,
|
|
148
|
-
std::vector<std::vector<index>> &bins) const;
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Finds the best seed for node @a u and stores it in @a s.
|
|
152
|
-
* @param strongAdjMatrix
|
|
153
|
-
* @param affinityMatrix Affinity matrix.
|
|
154
|
-
* @param diag Vector of diagonal entries of the Laplacian matrix.
|
|
155
|
-
* @param tVs Test vectors.
|
|
156
|
-
* @param status Aggregation labels.
|
|
157
|
-
* @param u The node to find the best seed for.
|
|
158
|
-
* @param s[out] The best seed for node @a u.
|
|
159
|
-
* @return @code{True} if a seed has been found for @a u, @code{false} otherwise.
|
|
160
|
-
*/
|
|
161
|
-
bool findBestSeedEnergyCorrected(const Matrix &strongAdjMatrix, const Matrix &affinityMatrix,
|
|
162
|
-
const std::vector<double> &diag,
|
|
163
|
-
const std::vector<Vector> &tVs,
|
|
164
|
-
const std::vector<index> &status, index u, index &s) const;
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Determines if the Laplacian matrix @a A can be coarsened further.
|
|
168
|
-
* @param A Laplacian matrix.
|
|
169
|
-
* @return @code{True} if @a A can be coarsened further, @code{false} otherwise.
|
|
170
|
-
*/
|
|
171
|
-
inline bool canCoarsen(const Matrix &A) const {
|
|
172
|
-
return A.numberOfRows() > MAX_DIRECT_SOLVE_SIZE;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Determines if the relaxation is fast enough to stop coarsening.
|
|
177
|
-
* @param A Laplacian matrix.
|
|
178
|
-
* @param lvlIndex The number of levels already created in the hierarchy.
|
|
179
|
-
* @param tv Test vector.
|
|
180
|
-
* @return @code{True} if convergence of relaxation is fast, @code{false} otherwise.
|
|
181
|
-
*/
|
|
182
|
-
bool isRelaxationFast(const Matrix &A, index lvlIndex, Vector &tv) const;
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Computes the coarsened matrix of @a matrix by means of the projection matrix @a P and stores
|
|
186
|
-
* the result in @a B.
|
|
187
|
-
* @param P Projection matrix.
|
|
188
|
-
* @param A Laplacian matrix.
|
|
189
|
-
* @param PColIndex Stores the column index of the 1 entry at each row.
|
|
190
|
-
* @param PRowIndex Stores the row index of the 1 entry at each column.
|
|
191
|
-
* @param B[out] Resulting coarsened Laplacian matrix.
|
|
192
|
-
*/
|
|
193
|
-
void galerkinOperator(const Matrix &P, const Matrix &A, const std::vector<index> &PColIndex,
|
|
194
|
-
const std::vector<std::vector<index>> &PRowIndex, Matrix &B) const;
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Creates a @a hierarchy for the given Laplacian matrix @a matrix.
|
|
198
|
-
* @param matrix Laplcian matrix.
|
|
199
|
-
* @param hierarchy[out] The constructed hierarchy.
|
|
200
|
-
*/
|
|
201
|
-
void setupForMatrix(Matrix &matrix, LevelHierarchy<Matrix> &hierarchy) const;
|
|
202
|
-
|
|
203
|
-
public:
|
|
204
|
-
/**
|
|
205
|
-
* Creates an instance of MultiLevelSetup with the specified @a smoother used for relaxing
|
|
206
|
-
* during the setup phase.
|
|
207
|
-
* @param smoother Reference to smoother.
|
|
208
|
-
*/
|
|
209
|
-
MultiLevelSetup(const Smoother<Matrix> &smoother) : smoother(smoother) {}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Creates a @ hierarchy for the given Laplacian matrix of the graph @a G.
|
|
213
|
-
* @param G The graph.
|
|
214
|
-
* @param hierarchy[out] The constructed hierarchy.
|
|
215
|
-
*/
|
|
216
|
-
void setup(const Graph &G, LevelHierarchy<Matrix> &hierarchy) const {
|
|
217
|
-
setup(Matrix::laplacianMatrix(G), hierarchy);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Creates a @a hierarchy for the given Laplacian matrix @a matrix.
|
|
222
|
-
* @param matrix Laplcian matrix.
|
|
223
|
-
* @param hierarchy[out] The constructed hierarchy.
|
|
224
|
-
*/
|
|
225
|
-
void setup(Matrix matrix, LevelHierarchy<Matrix> &hierarchy) const;
|
|
226
|
-
};
|
|
227
|
-
|
|
228
|
-
template <class Matrix>
|
|
229
|
-
void MultiLevelSetup<Matrix>::setup(Matrix matrix, LevelHierarchy<Matrix> &hierarchy) const {
|
|
230
|
-
setupForMatrix(matrix, hierarchy);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
template <class Matrix>
|
|
234
|
-
void MultiLevelSetup<Matrix>::setupForMatrix(Matrix &A, LevelHierarchy<Matrix> &hierarchy) const {
|
|
235
|
-
hierarchy.addFinestLevel(A);
|
|
236
|
-
|
|
237
|
-
#ifndef NDEBUG
|
|
238
|
-
DEBUG("FINEST\t", A.numberOfRows(), "\t", A.nnz());
|
|
239
|
-
#endif // NDEBUG
|
|
240
|
-
|
|
241
|
-
bool doneCoarsening = false;
|
|
242
|
-
count numTVs = TV_NUM;
|
|
243
|
-
index level = 0;
|
|
244
|
-
|
|
245
|
-
while (!doneCoarsening) {
|
|
246
|
-
// ELIMINATION
|
|
247
|
-
if (coarseningElimination(A, hierarchy)) {
|
|
248
|
-
if (!canCoarsen(A))
|
|
249
|
-
doneCoarsening = true;
|
|
250
|
-
level++;
|
|
251
|
-
#ifndef NDEBUG
|
|
252
|
-
DEBUG(level, " ELIM\t\t", A.numberOfRows(), "\t", A.nnz() / 2);
|
|
253
|
-
#endif // NDEBUG
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// AGGREGATION
|
|
257
|
-
Vector tv;
|
|
258
|
-
if (doneCoarsening || isRelaxationFast(A, level, tv)) {
|
|
259
|
-
doneCoarsening = true;
|
|
260
|
-
} else {
|
|
261
|
-
coarseningAggregation(A, hierarchy, tv, numTVs);
|
|
262
|
-
level++;
|
|
263
|
-
#ifndef NDEBUG
|
|
264
|
-
DEBUG(level, " AGG\t\t", A.numberOfRows(), "\t", A.nnz() / 2);
|
|
265
|
-
#endif // NDEBUG
|
|
266
|
-
if (numTVs < TV_MAX) {
|
|
267
|
-
numTVs += TV_INC;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
if (!canCoarsen(A))
|
|
272
|
-
doneCoarsening = true;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
hierarchy.setLastAsCoarsest();
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
template <class Matrix>
|
|
279
|
-
bool MultiLevelSetup<Matrix>::coarseningElimination(Matrix &matrix,
|
|
280
|
-
LevelHierarchy<Matrix> &hierarchy) const {
|
|
281
|
-
std::vector<EliminationStage<Matrix>> coarseningStages;
|
|
282
|
-
count stageNum = 0;
|
|
283
|
-
while (stageNum < SETUP_ELIMINATION_MAX_STAGES) {
|
|
284
|
-
if (matrix.numberOfRows() <= MAX_DIRECT_SOLVE_SIZE)
|
|
285
|
-
break; // we do not need to coarsen the matrix any further
|
|
286
|
-
std::vector<bool> fNode;
|
|
287
|
-
count nf = lowDegreeSweep(matrix, fNode, stageNum);
|
|
288
|
-
count nc = matrix.numberOfRows() - nf;
|
|
289
|
-
|
|
290
|
-
if (nc == 0) { // do not eliminate all nodes -> leave one entry in c
|
|
291
|
-
nc = 1;
|
|
292
|
-
nf--;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
// add f nodes to fSet and c nodes to cSet
|
|
296
|
-
std::vector<index> fSet(nf);
|
|
297
|
-
std::vector<index> cSet(nc);
|
|
298
|
-
|
|
299
|
-
std::vector<index> coarseIndex(matrix.numberOfRows());
|
|
300
|
-
for (index i = 0, fIndex = 0, cIndex = 0; i < matrix.numberOfRows(); ++i) {
|
|
301
|
-
if (fNode[i] && fIndex < nf) {
|
|
302
|
-
coarseIndex[i] = fIndex;
|
|
303
|
-
fSet[fIndex++] = i;
|
|
304
|
-
} else {
|
|
305
|
-
coarseIndex[i] = cIndex;
|
|
306
|
-
cSet[cIndex++] = i;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
if (nf <= SETUP_ELIMINATION_MIN_ELIM_FRACTION * matrix.numberOfRows()) {
|
|
311
|
-
break;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
Matrix P;
|
|
315
|
-
Vector q;
|
|
316
|
-
eliminationOperators(matrix, fSet, coarseIndex, P, q);
|
|
317
|
-
coarseningStages.push_back(EliminationStage<Matrix>(P, q, fSet, cSet));
|
|
318
|
-
|
|
319
|
-
Matrix Acc = matrix.extract(cSet, cSet); // Schur complement
|
|
320
|
-
Matrix Acf = matrix.extract(cSet, fSet); // Schur complement
|
|
321
|
-
|
|
322
|
-
matrix = Acc + Acf * P;
|
|
323
|
-
stageNum++;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
if (stageNum != 0) { // we have coarsened the matrix
|
|
327
|
-
hierarchy.addEliminationLevel(matrix, coarseningStages);
|
|
328
|
-
return true;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
return false;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
template <class Matrix>
|
|
335
|
-
count MultiLevelSetup<Matrix>::lowDegreeSweep(const Matrix &matrix, std::vector<bool> &fNode,
|
|
336
|
-
index stage) const {
|
|
337
|
-
fNode.resize(matrix.numberOfRows(), true); // first mark all nodes as f nodes
|
|
338
|
-
count numFNodes = 0;
|
|
339
|
-
int degreeOffset = stage != 0;
|
|
340
|
-
|
|
341
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
342
|
-
if ((int)matrix.nnzInRow(i) - degreeOffset <= (int)SETUP_ELIMINATION_MAX_DEGREE
|
|
343
|
-
&& fNode[i]) { // node i has degree <= 4 and can be eliminated
|
|
344
|
-
numFNodes++;
|
|
345
|
-
// To maintain independence, mark all neighbors as not eliminated all neighbors of this
|
|
346
|
-
// f node are c nodes
|
|
347
|
-
matrix.forNonZeroElementsInRow(i, [&](index j, edgeweight /*w*/) {
|
|
348
|
-
if (j != i) {
|
|
349
|
-
fNode[j] = false;
|
|
350
|
-
}
|
|
351
|
-
});
|
|
352
|
-
} else { // Node has high degree, thus it is a c node
|
|
353
|
-
fNode[i] = false;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
return numFNodes;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
template <class Matrix>
|
|
361
|
-
void MultiLevelSetup<Matrix>::eliminationOperators(const Matrix &matrix,
|
|
362
|
-
const std::vector<index> &fSet,
|
|
363
|
-
const std::vector<index> &coarseIndex, Matrix &P,
|
|
364
|
-
Vector &q) const {
|
|
365
|
-
std::vector<Triplet> triples;
|
|
366
|
-
q = Vector(fSet.size());
|
|
367
|
-
for (index k = 0; k < fSet.size(); ++k) { // Afc
|
|
368
|
-
matrix.forNonZeroElementsInRow(fSet[k], [&](index j, edgeweight w) {
|
|
369
|
-
if (fSet[k] == j) {
|
|
370
|
-
q[k] = 1.0 / w;
|
|
371
|
-
} else {
|
|
372
|
-
triples.push_back({k, coarseIndex[j], w});
|
|
373
|
-
}
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
for (index i = 0; i < triples.size(); ++i) { // * -Aff^-1
|
|
378
|
-
triples[i].value *= -q[triples[i].row];
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
P = Matrix(fSet.size(), coarseIndex.size() - fSet.size(), triples);
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
template <class Matrix>
|
|
385
|
-
void MultiLevelSetup<Matrix>::coarseningAggregation(Matrix &matrix,
|
|
386
|
-
LevelHierarchy<Matrix> &hierarchy, Vector &tv,
|
|
387
|
-
count numTVVectors) const {
|
|
388
|
-
Vector B(SETUP_MAX_AGGREGATION_STAGES, std::numeric_limits<double>::max());
|
|
389
|
-
std::vector<std::vector<index>> S(
|
|
390
|
-
SETUP_MAX_AGGREGATION_STAGES,
|
|
391
|
-
std::vector<index>(matrix.numberOfRows(), std::numeric_limits<index>::max()));
|
|
392
|
-
std::vector<index> status(matrix.numberOfRows(), UNDECIDED);
|
|
393
|
-
std::vector<count> nc(SETUP_MAX_AGGREGATION_STAGES, matrix.numberOfRows());
|
|
394
|
-
|
|
395
|
-
double alpha = 1.0;
|
|
396
|
-
double maxCoarseningRatio = SETUP_COARSENING_WORK_GUARD / SETUP_CYCLE_INDEX;
|
|
397
|
-
count stage = 0;
|
|
398
|
-
count nC = matrix.numberOfRows();
|
|
399
|
-
|
|
400
|
-
// generate TVs
|
|
401
|
-
std::vector<Vector> tVs = generateTVs(matrix, tv, numTVVectors);
|
|
402
|
-
|
|
403
|
-
// compute strong adjacency matrix
|
|
404
|
-
Matrix Wstrong;
|
|
405
|
-
computeStrongAdjacencyMatrix(matrix, Wstrong);
|
|
406
|
-
|
|
407
|
-
// compute affinityMatrix
|
|
408
|
-
Matrix affinityMatrix;
|
|
409
|
-
computeAffinityMatrix(Wstrong, tVs, affinityMatrix);
|
|
410
|
-
|
|
411
|
-
// mark all locally high-degree nodes as seeds
|
|
412
|
-
addHighDegreeSeedNodes(matrix, status);
|
|
413
|
-
|
|
414
|
-
// aggregate all loose nodes
|
|
415
|
-
aggregateLooseNodes(Wstrong, status, nC);
|
|
416
|
-
|
|
417
|
-
nc[0] = nC;
|
|
418
|
-
while (stage < SETUP_MIN_AGGREGATION_STAGES
|
|
419
|
-
|| (alpha >= maxCoarseningRatio && stage < SETUP_MAX_AGGREGATION_STAGES)) {
|
|
420
|
-
nC = stage > 0 ? nc[stage - 1] : nc[0];
|
|
421
|
-
|
|
422
|
-
// aggregation stage
|
|
423
|
-
aggregationStage(matrix, nC, Wstrong, affinityMatrix, tVs, status);
|
|
424
|
-
|
|
425
|
-
alpha = (double)nC / (double)matrix.numberOfRows();
|
|
426
|
-
alpha <= maxCoarseningRatio ? B[stage] = 1.0 - alpha : B[stage] = 1.0 + alpha;
|
|
427
|
-
|
|
428
|
-
S[stage] = status;
|
|
429
|
-
nc[stage] = nC;
|
|
430
|
-
stage++;
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
double min = B[0];
|
|
434
|
-
index bestAggregate = 0;
|
|
435
|
-
for (index i = 1; i < stage; ++i) {
|
|
436
|
-
if (B[i] < min) {
|
|
437
|
-
bestAggregate = i;
|
|
438
|
-
min = B[i];
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
443
|
-
if (S[bestAggregate][i] == UNDECIDED) { // undediced nodes become their own seeds
|
|
444
|
-
S[bestAggregate][i] = i;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
std::vector<index> indexFine(matrix.numberOfRows(), 0);
|
|
449
|
-
index newIndex = 0;
|
|
450
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
451
|
-
if (S[bestAggregate][i] == i) {
|
|
452
|
-
indexFine[i] = newIndex++;
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
457
|
-
status[i] = indexFine[S[bestAggregate][i]];
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
assert(newIndex == nc[bestAggregate]);
|
|
461
|
-
|
|
462
|
-
// create interpolation matrix
|
|
463
|
-
std::vector<Triplet> pTriples(matrix.numberOfRows());
|
|
464
|
-
std::vector<Triplet> rTriples(matrix.numberOfRows());
|
|
465
|
-
std::vector<index> PColIndex(matrix.numberOfRows());
|
|
466
|
-
std::vector<std::vector<index>> PRowIndex(nc[bestAggregate]);
|
|
467
|
-
|
|
468
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
469
|
-
pTriples[i] = {i, status[i], 1};
|
|
470
|
-
rTriples[i] = {status[i], i, 1};
|
|
471
|
-
PColIndex[i] = status[i];
|
|
472
|
-
PRowIndex[status[i]].push_back(i);
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
Matrix P(matrix.numberOfRows(), nc[bestAggregate], pTriples);
|
|
476
|
-
Matrix R(nc[bestAggregate], matrix.numberOfRows(), rTriples);
|
|
477
|
-
|
|
478
|
-
// create coarsened laplacian
|
|
479
|
-
galerkinOperator(P, matrix, PColIndex, PRowIndex, matrix);
|
|
480
|
-
|
|
481
|
-
hierarchy.addAggregationLevel(matrix, P, R);
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
template <class Matrix>
|
|
485
|
-
std::vector<Vector> MultiLevelSetup<Matrix>::generateTVs(const Matrix &matrix, Vector &tv,
|
|
486
|
-
count numVectors) const {
|
|
487
|
-
std::vector<Vector> testVectors(numVectors, Vector(matrix.numberOfColumns()));
|
|
488
|
-
|
|
489
|
-
testVectors[0] = tv;
|
|
490
|
-
|
|
491
|
-
if (numVectors > 1) {
|
|
492
|
-
Vector b(matrix.numberOfColumns(), 0.0);
|
|
493
|
-
#pragma omp parallel for
|
|
494
|
-
for (omp_index i = 1; i < static_cast<omp_index>(numVectors); ++i) {
|
|
495
|
-
for (count j = 0; j < matrix.numberOfColumns(); ++j) {
|
|
496
|
-
testVectors[i][j] = 2 * Aux::Random::probability() - 1;
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
testVectors[i] = smoother.relax(matrix, b, testVectors[i], SETUP_TV_SWEEPS);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
return testVectors;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
template <class Matrix>
|
|
507
|
-
void MultiLevelSetup<Matrix>::addHighDegreeSeedNodes(const Matrix &matrix,
|
|
508
|
-
std::vector<index> &status) const {
|
|
509
|
-
std::vector<count> deg(matrix.numberOfRows());
|
|
510
|
-
#pragma omp parallel for
|
|
511
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
512
|
-
deg[i] = matrix.nnzInRow(i) - 1;
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
#pragma omp parallel for
|
|
516
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
517
|
-
double num = 0.0;
|
|
518
|
-
double denom = 0.0;
|
|
519
|
-
matrix.forNonZeroElementsInRow(i, [&](index j, double value) {
|
|
520
|
-
if (i != j) {
|
|
521
|
-
num += std::abs(value) * (double)deg[j];
|
|
522
|
-
} else {
|
|
523
|
-
denom = std::abs(value);
|
|
524
|
-
}
|
|
525
|
-
});
|
|
526
|
-
|
|
527
|
-
// High degree node becomes seed
|
|
528
|
-
if ((double)deg[i] >= SETUP_AGGREGATION_DEGREE_THRESHOLD * (num / denom)) {
|
|
529
|
-
status[i] = i;
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
template <class Matrix>
|
|
535
|
-
void MultiLevelSetup<Matrix>::aggregateLooseNodes(const Matrix &strongAdjMatrix,
|
|
536
|
-
std::vector<index> &status, count &nc) const {
|
|
537
|
-
std::vector<index> looseNodes;
|
|
538
|
-
for (index i = 0; i < strongAdjMatrix.numberOfRows(); ++i) {
|
|
539
|
-
double max = std::numeric_limits<double>::min();
|
|
540
|
-
strongAdjMatrix.forNonZeroElementsInRow(i, [&](index /*j*/, double value) {
|
|
541
|
-
if (value > max)
|
|
542
|
-
max = value;
|
|
543
|
-
});
|
|
544
|
-
|
|
545
|
-
if (std::abs(max) < 1e-9 || max == std::numeric_limits<double>::min()) {
|
|
546
|
-
looseNodes.push_back(i);
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
if (!looseNodes.empty()) {
|
|
551
|
-
status[looseNodes[0]] = looseNodes[0]; // mark first as seed
|
|
552
|
-
for (index k = 1; k < looseNodes.size(); ++k) {
|
|
553
|
-
status[looseNodes[k]] = looseNodes[0]; // first loose nodes becomes seed
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
nc -= looseNodes.size() - 1;
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
template <class Matrix>
|
|
561
|
-
void MultiLevelSetup<Matrix>::computeStrongAdjacencyMatrix(const Matrix &matrix,
|
|
562
|
-
Matrix &strongAdjMatrix) const {
|
|
563
|
-
std::vector<double> maxNeighbor(matrix.numberOfRows(), std::numeric_limits<double>::min());
|
|
564
|
-
#pragma omp parallel for
|
|
565
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
566
|
-
matrix.forNonZeroElementsInRow(i, [&](index j, double value) {
|
|
567
|
-
if (i != j && -value > maxNeighbor[i]) {
|
|
568
|
-
maxNeighbor[i] = -value;
|
|
569
|
-
}
|
|
570
|
-
});
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
std::vector<index> rowIdx(matrix.numberOfRows() + 1, 0);
|
|
574
|
-
|
|
575
|
-
matrix.parallelForNonZeroElementsInRowOrder([&](index i, index j, double value) {
|
|
576
|
-
if (i != j && std::abs(value) >= 0.1 * std::min(maxNeighbor[i], maxNeighbor[j])) {
|
|
577
|
-
++rowIdx[i + 1];
|
|
578
|
-
}
|
|
579
|
-
});
|
|
580
|
-
|
|
581
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
582
|
-
rowIdx[i + 1] += rowIdx[i];
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
count nnz = rowIdx[matrix.numberOfRows()];
|
|
586
|
-
std::vector<Triplet> triplets(nnz);
|
|
587
|
-
|
|
588
|
-
#pragma omp parallel for
|
|
589
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
590
|
-
index cIdx = rowIdx[i];
|
|
591
|
-
matrix.forNonZeroElementsInRow(i, [&](index j, double value) {
|
|
592
|
-
if (i != j && std::abs(value) >= 0.1 * std::min(maxNeighbor[i], maxNeighbor[j])) {
|
|
593
|
-
triplets[cIdx] = {static_cast<index>(i), j, -value};
|
|
594
|
-
++cIdx;
|
|
595
|
-
}
|
|
596
|
-
});
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
strongAdjMatrix = Matrix(matrix.numberOfRows(), matrix.numberOfColumns(), triplets);
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
template <class Matrix>
|
|
603
|
-
void MultiLevelSetup<Matrix>::computeAffinityMatrix(const Matrix &matrix,
|
|
604
|
-
const std::vector<Vector> &tVs,
|
|
605
|
-
Matrix &affinityMatrix) const {
|
|
606
|
-
assert(!tVs.empty());
|
|
607
|
-
|
|
608
|
-
std::vector<index> rowIdx(matrix.numberOfRows() + 1);
|
|
609
|
-
std::vector<Triplet> triplets(matrix.nnz());
|
|
610
|
-
|
|
611
|
-
#pragma omp parallel for
|
|
612
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
613
|
-
rowIdx[i + 1] = matrix.nnzInRow(i);
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
617
|
-
rowIdx[i + 1] += rowIdx[i];
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
std::vector<double> normSquared(matrix.numberOfRows(), 0.0);
|
|
621
|
-
#pragma omp parallel for
|
|
622
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
623
|
-
for (index k = 0; k < tVs.size(); ++k) {
|
|
624
|
-
normSquared[i] += tVs[k][i] * tVs[k][i];
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
#pragma omp parallel for
|
|
629
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
630
|
-
double nir = 1.0 / normSquared[i];
|
|
631
|
-
index cIdx = rowIdx[i];
|
|
632
|
-
matrix.forNonZeroElementsInRow(i, [&](index j, double /*val*/) {
|
|
633
|
-
double ij = 0.0;
|
|
634
|
-
for (index k = 0; k < tVs.size(); ++k) {
|
|
635
|
-
ij += tVs[k][i] * tVs[k][j];
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
double value = (ij * ij) * nir / normSquared[j];
|
|
639
|
-
triplets[cIdx] = {static_cast<index>(i), j, value};
|
|
640
|
-
++cIdx;
|
|
641
|
-
});
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
affinityMatrix = Matrix(matrix.numberOfRows(), matrix.numberOfColumns(), triplets);
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
template <class Matrix>
|
|
648
|
-
void MultiLevelSetup<Matrix>::aggregationStage(const Matrix &matrix, count &nc,
|
|
649
|
-
const Matrix &strongAdjMatrix,
|
|
650
|
-
const Matrix &affinityMatrix,
|
|
651
|
-
std::vector<Vector> &tVs,
|
|
652
|
-
std::vector<index> &status) const {
|
|
653
|
-
std::vector<std::vector<index>> bins(10);
|
|
654
|
-
computeStrongNeighbors(affinityMatrix, status, bins);
|
|
655
|
-
|
|
656
|
-
std::vector<double> diag(matrix.numberOfRows(), 0.0);
|
|
657
|
-
#pragma omp parallel for
|
|
658
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
659
|
-
diag[i] = matrix(i, i);
|
|
660
|
-
}
|
|
661
|
-
// Iterate over undecided nodes with strong neighbors in decreasing order of strongest neighbor
|
|
662
|
-
for (index k = bins.size(); k-- > 0;) {
|
|
663
|
-
for (index i : bins[k]) {
|
|
664
|
-
if (status[i] == UNDECIDED) { // node is still undecided
|
|
665
|
-
index s = 0;
|
|
666
|
-
if (findBestSeedEnergyCorrected(strongAdjMatrix, affinityMatrix, diag, tVs, status,
|
|
667
|
-
i, s)) {
|
|
668
|
-
status[s] = s; // s becomes seed
|
|
669
|
-
status[i] = s; // i's seed is s
|
|
670
|
-
nc--;
|
|
671
|
-
|
|
672
|
-
for (index j = 0; j < tVs.size(); ++j) { // update test vectors
|
|
673
|
-
tVs[j][i] = tVs[j][s];
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
if (nc <= matrix.numberOfRows() * SETUP_COARSENING_WORK_GUARD / SETUP_CYCLE_INDEX) {
|
|
680
|
-
break;
|
|
681
|
-
}
|
|
682
|
-
} // iterate over bins
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
template <class Matrix>
|
|
686
|
-
void MultiLevelSetup<Matrix>::computeStrongNeighbors(const Matrix &affinityMatrix,
|
|
687
|
-
const std::vector<index> &status,
|
|
688
|
-
std::vector<std::vector<index>> &bins) const {
|
|
689
|
-
std::vector<bool> undecided(affinityMatrix.numberOfRows(), false);
|
|
690
|
-
std::vector<double> maxNeighbor(affinityMatrix.numberOfRows(),
|
|
691
|
-
std::numeric_limits<double>::min());
|
|
692
|
-
double overallMax = 0.0;
|
|
693
|
-
double overallMin = std::numeric_limits<double>::max();
|
|
694
|
-
|
|
695
|
-
affinityMatrix.parallelForNonZeroElementsInRowOrder(
|
|
696
|
-
[&](index i, index j,
|
|
697
|
-
double value) { // determine the highest affinity neighbor of each node
|
|
698
|
-
if (status[i] == UNDECIDED && (status[j] == UNDECIDED || status[j] == j)) {
|
|
699
|
-
// 'i' is UNDECIDED and its neighbor 'j' is also UNDECIDED or SEED
|
|
700
|
-
if (value > maxNeighbor[i]) {
|
|
701
|
-
maxNeighbor[i] = value;
|
|
702
|
-
}
|
|
703
|
-
undecided[i] = true;
|
|
704
|
-
}
|
|
705
|
-
});
|
|
706
|
-
|
|
707
|
-
for (index i = 0; i < affinityMatrix.numberOfRows(); ++i) {
|
|
708
|
-
if (maxNeighbor[i] > overallMax) {
|
|
709
|
-
overallMax = maxNeighbor[i];
|
|
710
|
-
}
|
|
711
|
-
if (maxNeighbor[i] < overallMin) {
|
|
712
|
-
overallMin = maxNeighbor[i];
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
double h = std::fabs(overallMax - overallMin) < 1e-15
|
|
717
|
-
? 1.0
|
|
718
|
-
: (double)bins.size() / (overallMax - overallMin);
|
|
719
|
-
for (index i = 0; i < affinityMatrix.numberOfRows(); ++i) {
|
|
720
|
-
if (undecided[i]) { // undecided nodes with strong neighbors
|
|
721
|
-
index binIndex = (index)std::floor(h * (maxNeighbor[i] - overallMin));
|
|
722
|
-
if (binIndex == bins.size()) { // last interval is closed on the right
|
|
723
|
-
binIndex--;
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
assert(binIndex < bins.size());
|
|
727
|
-
bins[binIndex].push_back(i);
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
template <class Matrix>
|
|
733
|
-
bool MultiLevelSetup<Matrix>::findBestSeedEnergyCorrected(const Matrix &strongAdjMatrix,
|
|
734
|
-
const Matrix &affinityMatrix,
|
|
735
|
-
const std::vector<double> &diag,
|
|
736
|
-
const std::vector<Vector> &tVs,
|
|
737
|
-
const std::vector<index> &status,
|
|
738
|
-
const index u, index &s) const {
|
|
739
|
-
bool foundSeed = false;
|
|
740
|
-
std::vector<double> r(tVs.size(), 0.0);
|
|
741
|
-
std::vector<double> q(tVs.size(), 0.0);
|
|
742
|
-
std::vector<double> E(tVs.size(), 0.0);
|
|
743
|
-
|
|
744
|
-
double d = diag[u];
|
|
745
|
-
double d2 = 0.5 * diag[u];
|
|
746
|
-
for (index k = 0; k < tVs.size(); ++k) {
|
|
747
|
-
double rr = 0.0;
|
|
748
|
-
double qq = 0.0;
|
|
749
|
-
strongAdjMatrix.forNonZeroElementsInRow(u, [&](index v, double value) {
|
|
750
|
-
rr += value * tVs[k][v];
|
|
751
|
-
qq += value * 0.5 * tVs[k][v] * tVs[k][v];
|
|
752
|
-
});
|
|
753
|
-
|
|
754
|
-
r[k] = rr;
|
|
755
|
-
q[k] = qq;
|
|
756
|
-
double y = rr / d;
|
|
757
|
-
E[k] = (d2 * y - rr) * y + qq;
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
double maxNeighbor = -1.0;
|
|
761
|
-
affinityMatrix.forNonZeroElementsInRow(u, [&](index v, double value) {
|
|
762
|
-
if (status[v] == UNDECIDED || status[v] == v) {
|
|
763
|
-
double maxMu = -1.0;
|
|
764
|
-
bool smallRatio = true;
|
|
765
|
-
for (index k = 0; k < tVs.size(); ++k) {
|
|
766
|
-
double xv = tVs[k][v];
|
|
767
|
-
double Ec = (d2 * xv - r[k]) * xv + q[k];
|
|
768
|
-
double mu = Ec / (E[k] + 1e-15);
|
|
769
|
-
|
|
770
|
-
if (mu > maxMu) {
|
|
771
|
-
maxMu = mu;
|
|
772
|
-
}
|
|
773
|
-
if (maxMu > 2.5) {
|
|
774
|
-
smallRatio = false;
|
|
775
|
-
break;
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
if (smallRatio && value > maxNeighbor) {
|
|
780
|
-
maxNeighbor = value;
|
|
781
|
-
s = v;
|
|
782
|
-
foundSeed = true;
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
});
|
|
786
|
-
|
|
787
|
-
return foundSeed;
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
template <class Matrix>
|
|
791
|
-
bool MultiLevelSetup<Matrix>::isRelaxationFast(const Matrix &A, index lvlIndex, Vector &tv) const {
|
|
792
|
-
count nu = SETUP_RELAX_ACF_MIN_SWEEPS + 2 * (lvlIndex - 1);
|
|
793
|
-
count tvNu = SETUP_TV_SWEEPS;
|
|
794
|
-
count initial = 3;
|
|
795
|
-
|
|
796
|
-
// create testVector in [-1,1]
|
|
797
|
-
tv = Vector(A.numberOfRows());
|
|
798
|
-
for (index i = 0; i < tv.getDimension(); ++i) {
|
|
799
|
-
tv[i] = 2.0 * Aux::Random::probability() - 1.0;
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
Vector b(A.numberOfRows(), 0.0);
|
|
803
|
-
Vector x = tv;
|
|
804
|
-
x = smoother.relax(A, b, x, initial);
|
|
805
|
-
tv = smoother.relax(A, b, x, tvNu - initial);
|
|
806
|
-
Vector y = smoother.relax(A, b, tv, nu - tvNu);
|
|
807
|
-
double relaxAcf = std::pow((y - y.mean()).length() / (x - x.mean()).length(),
|
|
808
|
-
(double)1.0 / (double)(nu - initial));
|
|
809
|
-
return relaxAcf <= SETUP_MAX_COARSE_RELAX_ACF || !canCoarsen(A);
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
template <class Matrix>
|
|
813
|
-
void MultiLevelSetup<Matrix>::galerkinOperator(const Matrix &P, const Matrix &A,
|
|
814
|
-
const std::vector<index> &PColIndex,
|
|
815
|
-
const std::vector<std::vector<index>> &PRowIndex,
|
|
816
|
-
Matrix &B) const {
|
|
817
|
-
std::vector<Triplet> triplets;
|
|
818
|
-
SparseAccumulator spa(P.numberOfColumns());
|
|
819
|
-
for (index i = 0; i < P.numberOfColumns(); ++i) {
|
|
820
|
-
for (index k : PRowIndex[i]) {
|
|
821
|
-
double Pki = P(k, i);
|
|
822
|
-
A.forNonZeroElementsInRow(k, [&](index l, double value) {
|
|
823
|
-
index j = PColIndex[l];
|
|
824
|
-
spa.scatter(Pki * value * P(l, j), j);
|
|
825
|
-
});
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
spa.gather([&](index i, index j, double value) { triplets.push_back({i, j, value}); });
|
|
829
|
-
|
|
830
|
-
spa.increaseRow();
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
B = Matrix(P.numberOfColumns(), P.numberOfColumns(), triplets);
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
template <>
|
|
837
|
-
inline void MultiLevelSetup<CSRMatrix>::setup(CSRMatrix matrix,
|
|
838
|
-
LevelHierarchy<CSRMatrix> &hierarchy) const {
|
|
839
|
-
matrix.sort();
|
|
840
|
-
setupForMatrix(matrix, hierarchy);
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
template <>
|
|
844
|
-
inline void
|
|
845
|
-
MultiLevelSetup<CSRMatrix>::computeStrongAdjacencyMatrix(const CSRMatrix &matrix,
|
|
846
|
-
CSRMatrix &strongAdjMatrix) const {
|
|
847
|
-
std::vector<double> maxNeighbor(matrix.numberOfRows(), std::numeric_limits<double>::min());
|
|
848
|
-
#pragma omp parallel for
|
|
849
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
850
|
-
matrix.forNonZeroElementsInRow(i, [&](index j, double value) {
|
|
851
|
-
if (i != j && -value > maxNeighbor[i]) {
|
|
852
|
-
maxNeighbor[i] = -value;
|
|
853
|
-
}
|
|
854
|
-
});
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
std::vector<index> rowIdx(matrix.numberOfRows() + 1, 0);
|
|
858
|
-
matrix.parallelForNonZeroElementsInRowOrder([&](index i, index j, double value) {
|
|
859
|
-
if (i != j && std::abs(value) >= 0.1 * std::min(maxNeighbor[i], maxNeighbor[j])) {
|
|
860
|
-
++rowIdx[i + 1];
|
|
861
|
-
}
|
|
862
|
-
});
|
|
863
|
-
|
|
864
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
865
|
-
rowIdx[i + 1] += rowIdx[i];
|
|
866
|
-
}
|
|
867
|
-
|
|
868
|
-
count nnz = rowIdx[matrix.numberOfRows()];
|
|
869
|
-
std::vector<index> columnIdx(nnz);
|
|
870
|
-
std::vector<double> nonZeros(nnz);
|
|
871
|
-
|
|
872
|
-
#pragma omp parallel for
|
|
873
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
874
|
-
index cIdx = rowIdx[i];
|
|
875
|
-
matrix.forNonZeroElementsInRow(i, [&](index j, double value) {
|
|
876
|
-
if (i != j && std::abs(value) >= 0.1 * std::min(maxNeighbor[i], maxNeighbor[j])) {
|
|
877
|
-
columnIdx[cIdx] = j;
|
|
878
|
-
nonZeros[cIdx] = -value;
|
|
879
|
-
++cIdx;
|
|
880
|
-
}
|
|
881
|
-
});
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
strongAdjMatrix = CSRMatrix(matrix.numberOfRows(), matrix.numberOfColumns(), rowIdx, columnIdx,
|
|
885
|
-
nonZeros, 0.0, matrix.sorted());
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
template <>
|
|
889
|
-
inline void MultiLevelSetup<CSRMatrix>::computeAffinityMatrix(const CSRMatrix &matrix,
|
|
890
|
-
const std::vector<Vector> &tVs,
|
|
891
|
-
CSRMatrix &affinityMatrix) const {
|
|
892
|
-
assert(!tVs.empty());
|
|
893
|
-
|
|
894
|
-
std::vector<index> rowIdx(matrix.numberOfRows() + 1);
|
|
895
|
-
std::vector<index> columnIdx(matrix.nnz());
|
|
896
|
-
std::vector<double> nonZeros(matrix.nnz());
|
|
897
|
-
|
|
898
|
-
#pragma omp parallel for
|
|
899
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
900
|
-
rowIdx[i + 1] = matrix.nnzInRow(i);
|
|
901
|
-
}
|
|
902
|
-
|
|
903
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
904
|
-
rowIdx[i + 1] += rowIdx[i];
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
std::vector<double> normSquared(matrix.numberOfRows(), 0.0);
|
|
908
|
-
#pragma omp parallel for
|
|
909
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
910
|
-
for (index k = 0; k < tVs.size(); ++k) {
|
|
911
|
-
normSquared[i] += tVs[k][i] * tVs[k][i];
|
|
912
|
-
}
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
#pragma omp parallel for
|
|
916
|
-
for (omp_index i = 0; i < static_cast<omp_index>(matrix.numberOfRows()); ++i) {
|
|
917
|
-
double nir = 1.0 / normSquared[i];
|
|
918
|
-
index cIdx = rowIdx[i];
|
|
919
|
-
matrix.forNonZeroElementsInRow(i, [&](index j, double /*val*/) {
|
|
920
|
-
double ij = 0.0;
|
|
921
|
-
for (index k = 0; k < tVs.size(); ++k) {
|
|
922
|
-
ij += tVs[k][i] * tVs[k][j];
|
|
923
|
-
}
|
|
924
|
-
|
|
925
|
-
double value = (ij * ij) * nir / normSquared[j];
|
|
926
|
-
columnIdx[cIdx] = j;
|
|
927
|
-
nonZeros[cIdx] = value;
|
|
928
|
-
++cIdx;
|
|
929
|
-
});
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
affinityMatrix = CSRMatrix(matrix.numberOfRows(), matrix.numberOfColumns(), rowIdx, columnIdx,
|
|
933
|
-
nonZeros, 0.0, matrix.sorted());
|
|
934
|
-
}
|
|
935
|
-
|
|
936
|
-
template <>
|
|
937
|
-
inline void MultiLevelSetup<CSRMatrix>::galerkinOperator(
|
|
938
|
-
const CSRMatrix &P, const CSRMatrix &A, const std::vector<index> &PColIndex,
|
|
939
|
-
const std::vector<std::vector<index>> &PRowIndex, CSRMatrix &B) const {
|
|
940
|
-
std::vector<Triplet> triplets;
|
|
941
|
-
SparseAccumulator spa(P.numberOfColumns());
|
|
942
|
-
for (index i = 0; i < P.numberOfColumns(); ++i) {
|
|
943
|
-
for (index k : PRowIndex[i]) {
|
|
944
|
-
double Pki = P(k, i);
|
|
945
|
-
A.forNonZeroElementsInRow(k, [&](index l, double value) {
|
|
946
|
-
index j = PColIndex[l];
|
|
947
|
-
spa.scatter(Pki * value * P(l, j), j);
|
|
948
|
-
});
|
|
949
|
-
}
|
|
950
|
-
|
|
951
|
-
spa.gather([&](index i, index j, double value) { triplets.push_back({i, j, value}); });
|
|
952
|
-
|
|
953
|
-
spa.increaseRow();
|
|
954
|
-
}
|
|
955
|
-
|
|
956
|
-
B = CSRMatrix(P.numberOfColumns(), P.numberOfColumns(), triplets, 0.0, true);
|
|
957
|
-
}
|
|
958
|
-
|
|
959
|
-
template <>
|
|
960
|
-
inline void MultiLevelSetup<CSRMatrix>::eliminationOperators(const CSRMatrix &matrix,
|
|
961
|
-
const std::vector<index> &fSet,
|
|
962
|
-
const std::vector<index> &coarseIndex,
|
|
963
|
-
CSRMatrix &P, Vector &q) const {
|
|
964
|
-
std::vector<Triplet> triples;
|
|
965
|
-
q = Vector(fSet.size());
|
|
966
|
-
for (index k = 0; k < fSet.size(); ++k) { // Afc
|
|
967
|
-
matrix.forNonZeroElementsInRow(fSet[k], [&](index j, edgeweight w) {
|
|
968
|
-
if (fSet[k] == j) {
|
|
969
|
-
q[k] = 1.0 / w;
|
|
970
|
-
} else {
|
|
971
|
-
triples.push_back({k, coarseIndex[j], w});
|
|
972
|
-
}
|
|
973
|
-
});
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
for (index i = 0; i < triples.size(); ++i) { // * -Aff^-1
|
|
977
|
-
triples[i].value *= -q[triples[i].row];
|
|
978
|
-
}
|
|
979
|
-
|
|
980
|
-
P = CSRMatrix(fSet.size(), coarseIndex.size() - fSet.size(), triples, 0.0, matrix.sorted());
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
template <>
|
|
984
|
-
inline void MultiLevelSetup<CSRMatrix>::coarseningAggregation(CSRMatrix &matrix,
|
|
985
|
-
LevelHierarchy<CSRMatrix> &hierarchy,
|
|
986
|
-
Vector &tv,
|
|
987
|
-
count numTVVectors) const {
|
|
988
|
-
Vector B(SETUP_MAX_AGGREGATION_STAGES, std::numeric_limits<double>::max());
|
|
989
|
-
std::vector<std::vector<index>> S(
|
|
990
|
-
SETUP_MAX_AGGREGATION_STAGES,
|
|
991
|
-
std::vector<index>(matrix.numberOfRows(), std::numeric_limits<index>::max()));
|
|
992
|
-
std::vector<index> status(matrix.numberOfRows(), UNDECIDED);
|
|
993
|
-
std::vector<count> nc(SETUP_MAX_AGGREGATION_STAGES, matrix.numberOfRows());
|
|
994
|
-
|
|
995
|
-
double alpha = 1.0;
|
|
996
|
-
double maxCoarseningRatio = SETUP_COARSENING_WORK_GUARD / SETUP_CYCLE_INDEX;
|
|
997
|
-
count stage = 0;
|
|
998
|
-
count nC = matrix.numberOfRows();
|
|
999
|
-
|
|
1000
|
-
// generate TVs
|
|
1001
|
-
std::vector<Vector> tVs = generateTVs(matrix, tv, numTVVectors);
|
|
1002
|
-
|
|
1003
|
-
// compute strong adjacency matrix
|
|
1004
|
-
CSRMatrix Wstrong;
|
|
1005
|
-
computeStrongAdjacencyMatrix(matrix, Wstrong);
|
|
1006
|
-
|
|
1007
|
-
// compute affinityMatrix
|
|
1008
|
-
CSRMatrix affinityMatrix;
|
|
1009
|
-
computeAffinityMatrix(Wstrong, tVs, affinityMatrix);
|
|
1010
|
-
|
|
1011
|
-
// mark all locally high-degree nodes as seeds
|
|
1012
|
-
addHighDegreeSeedNodes(matrix, status);
|
|
1013
|
-
|
|
1014
|
-
// aggregate all loose nodes
|
|
1015
|
-
aggregateLooseNodes(Wstrong, status, nC);
|
|
1016
|
-
|
|
1017
|
-
nc[0] = nC;
|
|
1018
|
-
while (stage < SETUP_MIN_AGGREGATION_STAGES
|
|
1019
|
-
|| (alpha >= maxCoarseningRatio && stage < SETUP_MAX_AGGREGATION_STAGES)) {
|
|
1020
|
-
nC = stage > 0 ? nc[stage - 1] : nc[0];
|
|
1021
|
-
|
|
1022
|
-
// aggregation stage
|
|
1023
|
-
aggregationStage(matrix, nC, Wstrong, affinityMatrix, tVs, status);
|
|
1024
|
-
|
|
1025
|
-
alpha = (double)nC / (double)matrix.numberOfRows();
|
|
1026
|
-
alpha <= maxCoarseningRatio ? B[stage] = 1.0 - alpha : B[stage] = 1.0 + alpha;
|
|
1027
|
-
|
|
1028
|
-
S[stage] = status;
|
|
1029
|
-
nc[stage] = nC;
|
|
1030
|
-
stage++;
|
|
1031
|
-
}
|
|
1032
|
-
|
|
1033
|
-
double min = B[0];
|
|
1034
|
-
index bestAggregate = 0;
|
|
1035
|
-
for (index i = 1; i < stage; ++i) {
|
|
1036
|
-
if (B[i] < min) {
|
|
1037
|
-
bestAggregate = i;
|
|
1038
|
-
min = B[i];
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
|
|
1042
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
1043
|
-
if (S[bestAggregate][i] == UNDECIDED) { // undediced nodes become their own seeds
|
|
1044
|
-
S[bestAggregate][i] = i;
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
std::vector<index> indexFine(matrix.numberOfRows(), 0);
|
|
1049
|
-
index newIndex = 0;
|
|
1050
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
1051
|
-
if (S[bestAggregate][i] == i) {
|
|
1052
|
-
indexFine[i] = newIndex++;
|
|
1053
|
-
}
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
1057
|
-
status[i] = indexFine[S[bestAggregate][i]];
|
|
1058
|
-
}
|
|
1059
|
-
|
|
1060
|
-
assert(newIndex == nc[bestAggregate]);
|
|
1061
|
-
|
|
1062
|
-
// create interpolation matrix
|
|
1063
|
-
std::vector<Triplet> pTriples(matrix.numberOfRows());
|
|
1064
|
-
std::vector<Triplet> rTriples(matrix.numberOfRows());
|
|
1065
|
-
std::vector<index> PColIndex(matrix.numberOfRows());
|
|
1066
|
-
std::vector<std::vector<index>> PRowIndex(nc[bestAggregate]);
|
|
1067
|
-
|
|
1068
|
-
for (index i = 0; i < matrix.numberOfRows(); ++i) {
|
|
1069
|
-
pTriples[i] = {i, status[i], 1};
|
|
1070
|
-
rTriples[i] = {status[i], i, 1};
|
|
1071
|
-
PColIndex[i] = status[i];
|
|
1072
|
-
PRowIndex[status[i]].push_back(i);
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1075
|
-
CSRMatrix P(matrix.numberOfRows(), nc[bestAggregate], pTriples, 0.0, matrix.sorted());
|
|
1076
|
-
CSRMatrix R(nc[bestAggregate], matrix.numberOfRows(), rTriples, 0.0, matrix.sorted());
|
|
1077
|
-
|
|
1078
|
-
// create coarsened laplacian
|
|
1079
|
-
galerkinOperator(P, matrix, PColIndex, PRowIndex, matrix);
|
|
1080
|
-
|
|
1081
|
-
hierarchy.addAggregationLevel(matrix, P, R);
|
|
1082
|
-
}
|
|
1083
|
-
|
|
1084
|
-
extern template class MultiLevelSetup<CSRMatrix>;
|
|
1085
|
-
extern template class MultiLevelSetup<DenseMatrix>;
|
|
1086
|
-
extern template class MultiLevelSetup<DynamicMatrix>;
|
|
1087
|
-
|
|
1088
|
-
} /* namespace NetworKit */
|
|
1089
|
-
|
|
1090
|
-
#endif // NETWORKIT_NUMERICS_LAMG_MULTI_LEVEL_SETUP_HPP_
|