@ladybugmem/icebug 0.1.0

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