svf-tools 1.0.613 → 1.0.615

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 (542) hide show
  1. package/CMakeLists.txt +13 -0
  2. package/SVF-doxygen/html/html/AndersenPWC_8h_source.html +1 -1
  3. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +2 -2
  4. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +7 -6
  5. package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +15 -15
  6. package/SVF-doxygen/html/html/AndersenWaveDiff_8cpp_source.html +1 -1
  7. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +22 -22
  8. package/SVF-doxygen/html/html/Andersen_8h_source.html +16 -16
  9. package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +6 -6
  10. package/SVF-doxygen/html/html/CFLAlias_8h_source.html +7 -7
  11. package/SVF-doxygen/html/html/CFLBase_8cpp_source.html +6 -6
  12. package/SVF-doxygen/html/html/CFLGrammar_8cpp_source.html +1 -1
  13. package/SVF-doxygen/html/html/CFLGrammar_8h_source.html +1 -1
  14. package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +5 -5
  15. package/SVF-doxygen/html/html/CFLGraph_8cpp_source.html +11 -11
  16. package/SVF-doxygen/html/html/CFLGraph_8h_source.html +1 -1
  17. package/SVF-doxygen/html/html/CFLVF_8cpp_source.html +2 -2
  18. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +5 -5
  19. package/SVF-doxygen/html/html/CHG_8h_source.html +1 -1
  20. package/SVF-doxygen/html/html/CSC_8cpp_source.html +1 -1
  21. package/SVF-doxygen/html/html/ConditionalPT_8h_source.html +14 -14
  22. package/SVF-doxygen/html/html/ConsGNode_8h_source.html +1 -1
  23. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +3 -3
  24. package/SVF-doxygen/html/html/ConsG_8h_source.html +9 -9
  25. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +18 -18
  26. package/SVF-doxygen/html/html/ContextDDA_8h_source.html +9 -9
  27. package/SVF-doxygen/html/html/DCHG_8cpp_source.html +4 -4
  28. package/SVF-doxygen/html/html/DCHG_8h_source.html +1 -1
  29. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +8 -8
  30. package/SVF-doxygen/html/html/DDAClient_8h_source.html +1 -1
  31. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +4 -6
  32. package/SVF-doxygen/html/html/DDAPass_8h_source.html +3 -3
  33. package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +9 -9
  34. package/SVF-doxygen/html/html/DDAStat_8h_source.html +1 -1
  35. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +22 -22
  36. package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +1 -1
  37. package/SVF-doxygen/html/html/DoubleFreeChecker_8h_source.html +1 -1
  38. package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +1 -1
  39. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +21 -21
  40. package/SVF-doxygen/html/html/FSMPTA_8h_source.html +3 -3
  41. package/SVF-doxygen/html/html/FileChecker_8h_source.html +1 -1
  42. package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +10 -10
  43. package/SVF-doxygen/html/html/FlowDDA_8h_source.html +7 -7
  44. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +13 -13
  45. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +27 -28
  46. package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +65 -65
  47. package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +2 -2
  48. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +2 -2
  49. package/SVF-doxygen/html/html/ICFG_8h_source.html +2 -2
  50. package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +3 -3
  51. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +3 -3
  52. package/SVF-doxygen/html/html/IRGraph_8h_source.html +2 -2
  53. package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +6 -6
  54. package/SVF-doxygen/html/html/LLVMLoopAnalysis_8h_source.html +3 -3
  55. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +24 -29
  56. package/SVF-doxygen/html/html/LLVMModule_8h_source.html +8 -8
  57. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +2 -2
  58. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +9 -9
  59. package/SVF-doxygen/html/html/LeakChecker_8h_source.html +2 -2
  60. package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +9 -9
  61. package/SVF-doxygen/html/html/LocationSet_8h_source.html +3 -3
  62. package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +5 -5
  63. package/SVF-doxygen/html/html/LockAnalysis_8h_source.html +3 -3
  64. package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +3 -3
  65. package/SVF-doxygen/html/html/MHP_8cpp_source.html +10 -10
  66. package/SVF-doxygen/html/html/MHP_8h_source.html +5 -5
  67. package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +17 -17
  68. package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +8 -8
  69. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +3 -3
  70. package/SVF-doxygen/html/html/MTA_8cpp_source.html +12 -17
  71. package/SVF-doxygen/html/html/MTA_8h_source.html +3 -4
  72. package/SVF-doxygen/html/html/MemPartition_8cpp_source.html +10 -10
  73. package/SVF-doxygen/html/html/MemPartition_8h_source.html +1 -1
  74. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +34 -34
  75. package/SVF-doxygen/html/html/MemRegion_8h_source.html +7 -7
  76. package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +16 -15
  77. package/SVF-doxygen/html/html/MemSSA_8h_source.html +53 -52
  78. package/SVF-doxygen/html/html/MutablePointsToDS_8h_source.html +7 -8
  79. package/SVF-doxygen/html/html/NodeIDAllocator_8cpp_source.html +7 -7
  80. package/SVF-doxygen/html/html/Options_8cpp_source.html +52 -53
  81. package/SVF-doxygen/html/html/Options_8h_source.html +53 -54
  82. package/SVF-doxygen/html/html/PCG_8cpp_source.html +2 -2
  83. package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +3 -3
  84. package/SVF-doxygen/html/html/PTACallGraph_8h_source.html +1 -1
  85. package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +3 -3
  86. package/SVF-doxygen/html/html/PTAStat_8h_source.html +1 -1
  87. package/SVF-doxygen/html/html/PersistentPointsToCache_8h_source.html +33 -33
  88. package/SVF-doxygen/html/html/PersistentPointsToDS_8h_source.html +91 -95
  89. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +31 -39
  90. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +85 -92
  91. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +20 -20
  92. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +16 -16
  93. package/SVF-doxygen/html/html/PointsTo_8cpp.html +1 -0
  94. package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +51 -51
  95. package/SVF-doxygen/html/html/PointsTo_8h_source.html +38 -38
  96. package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +6 -6
  97. package/SVF-doxygen/html/html/SCC_8h_source.html +4 -4
  98. package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +11 -22
  99. package/SVF-doxygen/html/html/SVFGBuilder_8h_source.html +14 -17
  100. package/SVF-doxygen/html/html/SVFGEdge_8h_source.html +1 -1
  101. package/SVF-doxygen/html/html/SVFGNode_8h_source.html +1 -1
  102. package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +7 -7
  103. package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +21 -19
  104. package/SVF-doxygen/html/html/SVFGReadWrite_8cpp_source.html +5 -5
  105. package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +18 -18
  106. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +49 -62
  107. package/SVF-doxygen/html/html/SVFG_8h_source.html +45 -45
  108. package/SVF-doxygen/html/html/SVFIR2ItvExeState_8cpp_source.html +12 -12
  109. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +8 -8
  110. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +3 -3
  111. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +10 -16
  112. package/SVF-doxygen/html/html/SVFIR_8h_source.html +83 -83
  113. package/SVF-doxygen/html/html/SVFStat_8cpp_source.html +19 -19
  114. package/SVF-doxygen/html/html/SVFType_8h.html +22 -22
  115. package/SVF-doxygen/html/html/SVFType_8h_source.html +76 -77
  116. package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +5 -5
  117. package/SVF-doxygen/html/html/SVFUtil_8h_source.html +11 -11
  118. package/SVF-doxygen/html/html/SVFValue_8cpp_source.html +5 -5
  119. package/SVF-doxygen/html/html/SVFValue_8h_source.html +6 -6
  120. package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +1 -1
  121. package/SVF-doxygen/html/html/SVFVariables_8h_source.html +3 -3
  122. package/SVF-doxygen/html/html/SaberCondAllocator_8cpp_source.html +6 -6
  123. package/SVF-doxygen/html/html/SaberCondAllocator_8h_source.html +4 -4
  124. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +15 -15
  125. package/SVF-doxygen/html/html/SaberSVFGBuilder_8h_source.html +2 -3
  126. package/SVF-doxygen/html/html/SparseBitVector_8h_source.html +69 -71
  127. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +13 -13
  128. package/SVF-doxygen/html/html/SrcSnkDDA_8h_source.html +39 -39
  129. package/SVF-doxygen/html/html/Steensgaard_8h_source.html +1 -1
  130. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +7 -7
  131. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +49 -51
  132. package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +13 -13
  133. package/SVF-doxygen/html/html/TCT_8cpp_source.html +4 -4
  134. package/SVF-doxygen/html/html/TCT_8h_source.html +4 -4
  135. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +8 -8
  136. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +3 -3
  137. package/SVF-doxygen/html/html/VFGNode_8h_source.html +1 -1
  138. package/SVF-doxygen/html/html/VFG_8cpp_source.html +17 -17
  139. package/SVF-doxygen/html/html/VFG_8h_source.html +5 -5
  140. package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +8 -8
  141. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +33 -33
  142. package/SVF-doxygen/html/html/VersionedFlowSensitive_8h_source.html +4 -4
  143. package/SVF-doxygen/html/html/WPAFSSolver_8h_source.html +11 -11
  144. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +12 -12
  145. package/SVF-doxygen/html/html/WPAPass_8h_source.html +2 -2
  146. package/SVF-doxygen/html/html/WPASolver_8h_source.html +25 -25
  147. package/SVF-doxygen/html/html/Z3Expr_8cpp_source.html +1 -1
  148. package/SVF-doxygen/html/html/cfl_8cpp.html +1 -5
  149. package/SVF-doxygen/html/html/cfl_8cpp_source.html +1 -5
  150. package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode.html +2 -2
  151. package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode.html +2 -2
  152. package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode.html +2 -2
  153. package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient.html +2 -2
  154. package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +187 -188
  155. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +104 -107
  156. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +163 -164
  157. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +47 -50
  158. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +194 -195
  159. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +45 -48
  160. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +204 -205
  161. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +35 -38
  162. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +17 -17
  163. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +191 -192
  164. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +29 -32
  165. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl-members.html +122 -123
  166. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +158 -219
  167. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +2 -2
  168. package/SVF-doxygen/html/html/classSVF_1_1CFLAlias-members.html +137 -138
  169. package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +57 -49
  170. package/SVF-doxygen/html/html/classSVF_1_1CFLBase-members.html +138 -139
  171. package/SVF-doxygen/html/html/classSVF_1_1CFLBase.html +34 -34
  172. package/SVF-doxygen/html/html/classSVF_1_1CFLGraph.html +7 -7
  173. package/SVF-doxygen/html/html/classSVF_1_1CFLGraphBuilder.html +1 -1
  174. package/SVF-doxygen/html/html/classSVF_1_1CFLVF-members.html +140 -141
  175. package/SVF-doxygen/html/html/classSVF_1_1CFLVF.html +30 -30
  176. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +8 -8
  177. package/SVF-doxygen/html/html/classSVF_1_1CSC.html +2 -2
  178. package/SVF-doxygen/html/html/classSVF_1_1CallSite-members.html +1 -1
  179. package/SVF-doxygen/html/html/classSVF_1_1CallSite.html +10 -10
  180. package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +2 -2
  181. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +114 -114
  182. package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +6 -6
  183. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode.html +8 -8
  184. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +28 -28
  185. package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode.html +2 -2
  186. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +6 -6
  187. package/SVF-doxygen/html/html/classSVF_1_1DDAClient.html +4 -4
  188. package/SVF-doxygen/html/html/classSVF_1_1DDAPass-members.html +1 -1
  189. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +17 -31
  190. package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +10 -10
  191. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +40 -40
  192. package/SVF-doxygen/html/html/classSVF_1_1DFPTData.html +15 -15
  193. package/SVF-doxygen/html/html/classSVF_1_1DiffPTData.html +4 -4
  194. package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +11 -11
  195. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker-members.html +5 -5
  196. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +16 -16
  197. package/SVF-doxygen/html/html/classSVF_1_1DummyVersionPropSVFGNode.html +2 -2
  198. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +1 -1
  199. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +228 -229
  200. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +62 -65
  201. package/SVF-doxygen/html/html/classSVF_1_1FileChecker-members.html +5 -5
  202. package/SVF-doxygen/html/html/classSVF_1_1FileChecker.html +17 -17
  203. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA-members.html +194 -195
  204. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +55 -55
  205. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +219 -220
  206. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +335 -342
  207. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +57 -57
  208. package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +6 -6
  209. package/SVF-doxygen/html/html/classSVF_1_1FormalParmVFGNode.html +2 -2
  210. package/SVF-doxygen/html/html/classSVF_1_1FormalRetVFGNode.html +2 -2
  211. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +4 -4
  212. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +2 -2
  213. package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode.html +2 -2
  214. package/SVF-doxygen/html/html/classSVF_1_1ICFG-members.html +1 -1
  215. package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +6 -6
  216. package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +2 -2
  217. package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +4 -4
  218. package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +4 -4
  219. package/SVF-doxygen/html/html/classSVF_1_1InterDisjointMRG.html +2 -2
  220. package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +8 -8
  221. package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis-members.html +1 -1
  222. package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +20 -14
  223. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet-members.html +4 -4
  224. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +108 -94
  225. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker-members.html +5 -5
  226. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +36 -36
  227. package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode.html +2 -2
  228. package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +12 -12
  229. package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +25 -25
  230. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +3 -3
  231. package/SVF-doxygen/html/html/classSVF_1_1MHP.html +26 -26
  232. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +87 -87
  233. package/SVF-doxygen/html/html/classSVF_1_1MTA-members.html +2 -2
  234. package/SVF-doxygen/html/html/classSVF_1_1MTA.html +27 -33
  235. package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +21 -21
  236. package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +14 -14
  237. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder-members.html +41 -43
  238. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +57 -80
  239. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +3 -3
  240. package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +54 -54
  241. package/SVF-doxygen/html/html/classSVF_1_1MemRegion.html +4 -4
  242. package/SVF-doxygen/html/html/classSVF_1_1MemSSA-members.html +4 -3
  243. package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +170 -143
  244. package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat.html +16 -16
  245. package/SVF-doxygen/html/html/classSVF_1_1MutableDFPTData.html +2 -2
  246. package/SVF-doxygen/html/html/classSVF_1_1MutableDiffPTData-members.html +3 -3
  247. package/SVF-doxygen/html/html/classSVF_1_1MutableDiffPTData.html +13 -15
  248. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer.html +7 -7
  249. package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +2 -2
  250. package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +8 -8
  251. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +1 -1
  252. package/SVF-doxygen/html/html/classSVF_1_1Options-members.html +17 -18
  253. package/SVF-doxygen/html/html/classSVF_1_1Options.html +53 -79
  254. package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +2 -2
  255. package/SVF-doxygen/html/html/classSVF_1_1PCG.html +2 -2
  256. package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +2 -2
  257. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraph.html +3 -3
  258. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphNode.html +3 -3
  259. package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +4 -4
  260. package/SVF-doxygen/html/html/classSVF_1_1PTData.html +11 -11
  261. package/SVF-doxygen/html/html/classSVF_1_1PersistentDFPTData-members.html +28 -28
  262. package/SVF-doxygen/html/html/classSVF_1_1PersistentDFPTData.html +174 -177
  263. package/SVF-doxygen/html/html/classSVF_1_1PersistentDiffPTData-members.html +17 -17
  264. package/SVF-doxygen/html/html/classSVF_1_1PersistentDiffPTData.html +99 -102
  265. package/SVF-doxygen/html/html/classSVF_1_1PersistentIncDFPTData-members.html +30 -30
  266. package/SVF-doxygen/html/html/classSVF_1_1PersistentIncDFPTData.html +125 -127
  267. package/SVF-doxygen/html/html/classSVF_1_1PersistentPTData-members.html +13 -13
  268. package/SVF-doxygen/html/html/classSVF_1_1PersistentPTData.html +83 -86
  269. package/SVF-doxygen/html/html/classSVF_1_1PersistentPointsToCache-members.html +1 -1
  270. package/SVF-doxygen/html/html/classSVF_1_1PersistentPointsToCache.html +122 -122
  271. package/SVF-doxygen/html/html/classSVF_1_1PersistentVersionedPTData-members.html +22 -22
  272. package/SVF-doxygen/html/html/classSVF_1_1PersistentVersionedPTData.html +137 -140
  273. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +56 -56
  274. package/SVF-doxygen/html/html/classSVF_1_1PointsTo-members.html +16 -16
  275. package/SVF-doxygen/html/html/classSVF_1_1PointsTo.html +183 -178
  276. package/SVF-doxygen/html/html/classSVF_1_1PointsTo_1_1PointsToIterator-members.html +7 -7
  277. package/SVF-doxygen/html/html/classSVF_1_1PointsTo_1_1PointsToIterator.html +87 -65
  278. package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +6 -6
  279. package/SVF-doxygen/html/html/classSVF_1_1SCCDetection.html +3 -3
  280. package/SVF-doxygen/html/html/classSVF_1_1SCCDetection_1_1GNodeSCCInfo.html +1 -1
  281. package/SVF-doxygen/html/html/classSVF_1_1SVFArgument-members.html +1 -1
  282. package/SVF-doxygen/html/html/classSVF_1_1SVFArgument.html +4 -4
  283. package/SVF-doxygen/html/html/classSVF_1_1SVFArrayType.html +6 -6
  284. package/SVF-doxygen/html/html/classSVF_1_1SVFBasicBlock-members.html +3 -3
  285. package/SVF-doxygen/html/html/classSVF_1_1SVFBasicBlock.html +13 -16
  286. package/SVF-doxygen/html/html/classSVF_1_1SVFBlackHoleValue-members.html +1 -1
  287. package/SVF-doxygen/html/html/classSVF_1_1SVFBlackHoleValue.html +2 -2
  288. package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst-members.html +1 -1
  289. package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst.html +2 -2
  290. package/SVF-doxygen/html/html/classSVF_1_1SVFConstant-members.html +1 -1
  291. package/SVF-doxygen/html/html/classSVF_1_1SVFConstant.html +3 -3
  292. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantData-members.html +1 -1
  293. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantData.html +2 -2
  294. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantFP-members.html +1 -1
  295. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantFP.html +2 -2
  296. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantInt-members.html +1 -1
  297. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantInt.html +2 -2
  298. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantNullPtr-members.html +1 -1
  299. package/SVF-doxygen/html/html/classSVF_1_1SVFConstantNullPtr.html +2 -2
  300. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction-members.html +1 -1
  301. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction.html +5 -7
  302. package/SVF-doxygen/html/html/classSVF_1_1SVFFunctionType.html +9 -9
  303. package/SVF-doxygen/html/html/classSVF_1_1SVFG-members.html +2 -2
  304. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +211 -236
  305. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder-members.html +7 -9
  306. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +50 -138
  307. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT-members.html +9 -9
  308. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +82 -82
  309. package/SVF-doxygen/html/html/classSVF_1_1SVFGStat.html +5 -5
  310. package/SVF-doxygen/html/html/classSVF_1_1SVFGlobalValue-members.html +1 -1
  311. package/SVF-doxygen/html/html/classSVF_1_1SVFGlobalValue.html +2 -2
  312. package/SVF-doxygen/html/html/classSVF_1_1SVFIR-members.html +1 -1
  313. package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +203 -215
  314. package/SVF-doxygen/html/html/classSVF_1_1SVFIR2ItvExeState.html +13 -13
  315. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +79 -79
  316. package/SVF-doxygen/html/html/classSVF_1_1SVFInstruction-members.html +1 -1
  317. package/SVF-doxygen/html/html/classSVF_1_1SVFInstruction.html +4 -4
  318. package/SVF-doxygen/html/html/classSVF_1_1SVFIntergerType.html +5 -5
  319. package/SVF-doxygen/html/html/classSVF_1_1SVFLoopAndDomInfo-members.html +1 -1
  320. package/SVF-doxygen/html/html/classSVF_1_1SVFLoopAndDomInfo.html +5 -5
  321. package/SVF-doxygen/html/html/classSVF_1_1SVFMetadataAsValue-members.html +1 -1
  322. package/SVF-doxygen/html/html/classSVF_1_1SVFMetadataAsValue.html +2 -2
  323. package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +0 -4
  324. package/SVF-doxygen/html/html/classSVF_1_1SVFOtherType.html +5 -5
  325. package/SVF-doxygen/html/html/classSVF_1_1SVFOtherValue-members.html +1 -1
  326. package/SVF-doxygen/html/html/classSVF_1_1SVFOtherValue.html +3 -3
  327. package/SVF-doxygen/html/html/classSVF_1_1SVFPointerType.html +9 -9
  328. package/SVF-doxygen/html/html/classSVF_1_1SVFStat.html +19 -19
  329. package/SVF-doxygen/html/html/classSVF_1_1SVFStructType.html +5 -5
  330. package/SVF-doxygen/html/html/classSVF_1_1SVFType.html +38 -38
  331. package/SVF-doxygen/html/html/classSVF_1_1SVFValue-members.html +1 -1
  332. package/SVF-doxygen/html/html/classSVF_1_1SVFValue.html +4 -5
  333. package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +1 -1
  334. package/SVF-doxygen/html/html/classSVF_1_1SVFVirtualCallInst-members.html +1 -1
  335. package/SVF-doxygen/html/html/classSVF_1_1SVFVirtualCallInst.html +2 -2
  336. package/SVF-doxygen/html/html/classSVF_1_1SaberCondAllocator.html +9 -9
  337. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder-members.html +12 -14
  338. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +42 -68
  339. package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector-members.html +1 -1
  340. package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector.html +108 -109
  341. package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator-members.html +1 -1
  342. package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html +50 -50
  343. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA-members.html +6 -6
  344. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +146 -146
  345. package/SVF-doxygen/html/html/classSVF_1_1StInfo-members.html +5 -5
  346. package/SVF-doxygen/html/html/classSVF_1_1StInfo.html +48 -61
  347. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +178 -179
  348. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +35 -38
  349. package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode.html +1 -1
  350. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +20 -20
  351. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +42 -46
  352. package/SVF-doxygen/html/html/classSVF_1_1TCT.html +10 -10
  353. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +8 -8
  354. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +169 -170
  355. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +31 -34
  356. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +2 -2
  357. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +28 -28
  358. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +263 -264
  359. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +112 -115
  360. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +41 -41
  361. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive_1_1SCC.html +1 -1
  362. package/SVF-doxygen/html/html/classSVF_1_1VersionedPTData.html +9 -9
  363. package/SVF-doxygen/html/html/classSVF_1_1WPAFSSolver-members.html +2 -2
  364. package/SVF-doxygen/html/html/classSVF_1_1WPAFSSolver.html +9 -9
  365. package/SVF-doxygen/html/html/classSVF_1_1WPAMinimumSolver-members.html +2 -2
  366. package/SVF-doxygen/html/html/classSVF_1_1WPAMinimumSolver.html +15 -15
  367. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +25 -25
  368. package/SVF-doxygen/html/html/classSVF_1_1WPASCCSolver-members.html +2 -2
  369. package/SVF-doxygen/html/html/classSVF_1_1WPASCCSolver.html +17 -17
  370. package/SVF-doxygen/html/html/classSVF_1_1WPASolver-members.html +2 -2
  371. package/SVF-doxygen/html/html/classSVF_1_1WPASolver.html +76 -81
  372. package/SVF-doxygen/html/html/classSVF_1_1Z3Expr.html +2 -2
  373. package/SVF-doxygen/html/html/dda_8cpp.html +1 -1
  374. package/SVF-doxygen/html/html/dda_8cpp_source.html +1 -1
  375. package/SVF-doxygen/html/html/functions.html +1 -1
  376. package/SVF-doxygen/html/html/functions_0x7e.html +16 -16
  377. package/SVF-doxygen/html/html/functions_a.html +7 -7
  378. package/SVF-doxygen/html/html/functions_b.html +6 -6
  379. package/SVF-doxygen/html/html/functions_c.html +27 -27
  380. package/SVF-doxygen/html/html/functions_d.html +10 -11
  381. package/SVF-doxygen/html/html/functions_e.html +2 -2
  382. package/SVF-doxygen/html/html/functions_f.html +6 -6
  383. package/SVF-doxygen/html/html/functions_func.html +6 -6
  384. package/SVF-doxygen/html/html/functions_func_0x7e.html +16 -16
  385. package/SVF-doxygen/html/html/functions_func_b.html +6 -6
  386. package/SVF-doxygen/html/html/functions_func_c.html +27 -27
  387. package/SVF-doxygen/html/html/functions_func_d.html +10 -11
  388. package/SVF-doxygen/html/html/functions_func_e.html +2 -2
  389. package/SVF-doxygen/html/html/functions_func_f.html +5 -5
  390. package/SVF-doxygen/html/html/functions_func_g.html +22 -22
  391. package/SVF-doxygen/html/html/functions_func_h.html +3 -3
  392. package/SVF-doxygen/html/html/functions_func_i.html +3 -3
  393. package/SVF-doxygen/html/html/functions_func_o.html +3 -3
  394. package/SVF-doxygen/html/html/functions_func_p.html +5 -5
  395. package/SVF-doxygen/html/html/functions_func_r.html +5 -8
  396. package/SVF-doxygen/html/html/functions_func_s.html +6 -6
  397. package/SVF-doxygen/html/html/functions_func_t.html +1 -1
  398. package/SVF-doxygen/html/html/functions_func_u.html +23 -23
  399. package/SVF-doxygen/html/html/functions_g.html +25 -28
  400. package/SVF-doxygen/html/html/functions_h.html +3 -3
  401. package/SVF-doxygen/html/html/functions_i.html +6 -6
  402. package/SVF-doxygen/html/html/functions_m.html +1 -1
  403. package/SVF-doxygen/html/html/functions_o.html +13 -13
  404. package/SVF-doxygen/html/html/functions_p.html +19 -19
  405. package/SVF-doxygen/html/html/functions_r.html +11 -12
  406. package/SVF-doxygen/html/html/functions_s.html +33 -36
  407. package/SVF-doxygen/html/html/functions_t.html +12 -12
  408. package/SVF-doxygen/html/html/functions_type_t.html +1 -1
  409. package/SVF-doxygen/html/html/functions_u.html +26 -23
  410. package/SVF-doxygen/html/html/functions_v.html +6 -6
  411. package/SVF-doxygen/html/html/functions_vars.html +1 -1
  412. package/SVF-doxygen/html/html/functions_vars_f.html +1 -1
  413. package/SVF-doxygen/html/html/functions_vars_g.html +0 -3
  414. package/SVF-doxygen/html/html/functions_vars_i.html +1 -1
  415. package/SVF-doxygen/html/html/functions_vars_m.html +1 -1
  416. package/SVF-doxygen/html/html/functions_vars_p.html +2 -2
  417. package/SVF-doxygen/html/html/functions_vars_s.html +5 -8
  418. package/SVF-doxygen/html/html/functions_vars_t.html +1 -1
  419. package/SVF-doxygen/html/html/functions_vars_u.html +3 -0
  420. package/SVF-doxygen/html/html/functions_w.html +3 -7
  421. package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +1 -1
  422. package/SVF-doxygen/html/html/mta_8cpp.html +1 -1
  423. package/SVF-doxygen/html/html/mta_8cpp_source.html +1 -1
  424. package/SVF-doxygen/html/html/namespaceSVF.html +35 -35
  425. package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +2 -2
  426. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +4 -4
  427. package/SVF-doxygen/html/html/saber_8cpp.html +1 -5
  428. package/SVF-doxygen/html/html/saber_8cpp_source.html +1 -5
  429. package/SVF-doxygen/html/html/search/all_0.js +1 -1
  430. package/SVF-doxygen/html/html/search/all_1.js +4 -4
  431. package/SVF-doxygen/html/html/search/all_10.js +15 -15
  432. package/SVF-doxygen/html/html/search/all_11.js +1 -2
  433. package/SVF-doxygen/html/html/search/all_12.js +20 -21
  434. package/SVF-doxygen/html/html/search/all_13.js +8 -8
  435. package/SVF-doxygen/html/html/search/all_14.js +13 -12
  436. package/SVF-doxygen/html/html/search/all_15.js +4 -4
  437. package/SVF-doxygen/html/html/search/all_16.js +2 -2
  438. package/SVF-doxygen/html/html/search/all_19.js +16 -16
  439. package/SVF-doxygen/html/html/search/all_2.js +6 -6
  440. package/SVF-doxygen/html/html/search/all_3.js +14 -14
  441. package/SVF-doxygen/html/html/search/all_4.js +5 -5
  442. package/SVF-doxygen/html/html/search/all_5.js +2 -2
  443. package/SVF-doxygen/html/html/search/all_6.js +5 -5
  444. package/SVF-doxygen/html/html/search/all_7.js +11 -12
  445. package/SVF-doxygen/html/html/search/all_8.js +3 -3
  446. package/SVF-doxygen/html/html/search/all_9.js +4 -4
  447. package/SVF-doxygen/html/html/search/all_b.js +1 -1
  448. package/SVF-doxygen/html/html/search/all_c.js +3 -3
  449. package/SVF-doxygen/html/html/search/all_d.js +3 -3
  450. package/SVF-doxygen/html/html/search/all_e.js +2 -2
  451. package/SVF-doxygen/html/html/search/all_f.js +5 -5
  452. package/SVF-doxygen/html/html/search/functions_0.js +4 -4
  453. package/SVF-doxygen/html/html/search/functions_1.js +6 -6
  454. package/SVF-doxygen/html/html/search/functions_10.js +1 -2
  455. package/SVF-doxygen/html/html/search/functions_11.js +11 -11
  456. package/SVF-doxygen/html/html/search/functions_12.js +1 -1
  457. package/SVF-doxygen/html/html/search/functions_13.js +12 -12
  458. package/SVF-doxygen/html/html/search/functions_17.js +16 -16
  459. package/SVF-doxygen/html/html/search/functions_2.js +14 -14
  460. package/SVF-doxygen/html/html/search/functions_3.js +5 -5
  461. package/SVF-doxygen/html/html/search/functions_4.js +2 -2
  462. package/SVF-doxygen/html/html/search/functions_5.js +4 -4
  463. package/SVF-doxygen/html/html/search/functions_6.js +11 -11
  464. package/SVF-doxygen/html/html/search/functions_7.js +3 -3
  465. package/SVF-doxygen/html/html/search/functions_8.js +3 -3
  466. package/SVF-doxygen/html/html/search/functions_d.js +1 -1
  467. package/SVF-doxygen/html/html/search/functions_e.js +3 -3
  468. package/SVF-doxygen/html/html/search/functions_f.js +5 -5
  469. package/SVF-doxygen/html/html/search/typedefs_11.js +1 -1
  470. package/SVF-doxygen/html/html/search/variables_0.js +1 -1
  471. package/SVF-doxygen/html/html/search/variables_10.js +2 -2
  472. package/SVF-doxygen/html/html/search/variables_12.js +5 -6
  473. package/SVF-doxygen/html/html/search/variables_13.js +3 -3
  474. package/SVF-doxygen/html/html/search/variables_14.js +1 -0
  475. package/SVF-doxygen/html/html/search/variables_6.js +1 -1
  476. package/SVF-doxygen/html/html/search/variables_7.js +0 -1
  477. package/SVF-doxygen/html/html/search/variables_9.js +1 -1
  478. package/SVF-doxygen/html/html/search/variables_d.js +1 -1
  479. package/SVF-doxygen/html/html/search/variables_e.js +1 -1
  480. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4.html +14 -14
  481. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +2 -2
  482. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +1 -1
  483. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +1 -1
  484. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1SVFG_01_5_01_4.html +2 -2
  485. package/SVF-doxygen/html/html/structSVF_1_1Hash_3_01NodePair_01_4.html +3 -3
  486. package/SVF-doxygen/html/html/structSVF_1_1SparseBitVectorElement-members.html +1 -1
  487. package/SVF-doxygen/html/html/structSVF_1_1SparseBitVectorElement.html +47 -57
  488. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1NodePair_01_4.html +3 -3
  489. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1PointsTo_01_4.html +1 -1
  490. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1SparseBitVector_3_01N_01_4_01_4.html +5 -5
  491. package/SVF-doxygen/html/html/structstd_1_1hash_3_01std_1_1vector_3_01T_01_4_01_4.html +3 -3
  492. package/SVF-doxygen/html/html/svf-ex_8cpp.html +6 -7
  493. package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +7 -7
  494. package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +1 -1
  495. package/SVF-doxygen/html/html/wpa_8cpp.html +1 -1
  496. package/SVF-doxygen/html/html/wpa_8cpp_source.html +1 -1
  497. package/build.sh +2 -2
  498. package/include/DDA/DDAPass.h +1 -1
  499. package/include/DDA/FlowDDA.h +1 -1
  500. package/include/Graphs/ICFG.h +1 -1
  501. package/include/Graphs/SVFG.h +3 -4
  502. package/include/Graphs/SVFGOPT.h +7 -7
  503. package/include/MSSA/MemSSA.h +2 -0
  504. package/include/MSSA/SVFGBuilder.h +5 -14
  505. package/include/MTA/MTA.h +2 -2
  506. package/include/MemoryModel/MutablePointsToDS.h +3 -3
  507. package/include/MemoryModel/PersistentPointsToCache.h +7 -8
  508. package/include/MemoryModel/PersistentPointsToDS.h +93 -93
  509. package/include/MemoryModel/PointerAnalysisImpl.h +17 -28
  510. package/include/MemoryModel/PointsTo.h +24 -24
  511. package/include/SABER/SrcSnkDDA.h +10 -13
  512. package/include/SVF-LLVM/LLVMLoopAnalysis.h +2 -1
  513. package/include/SVF-LLVM/LLVMModule.h +6 -6
  514. package/include/SVFIR/SVFIR.h +3 -5
  515. package/include/SVFIR/SVFType.h +6 -8
  516. package/include/SVFIR/SVFValue.h +5 -5
  517. package/include/Util/Options.h +0 -1
  518. package/include/Util/SparseBitVector.h +6 -14
  519. package/include/WPA/FlowSensitive.h +13 -20
  520. package/include/WPA/WPASolver.h +5 -9
  521. package/lib/DDA/DDAPass.cpp +4 -4
  522. package/lib/Graphs/CFLGraph.cpp +3 -0
  523. package/lib/Graphs/SVFG.cpp +1 -1
  524. package/lib/MSSA/MemSSA.cpp +5 -3
  525. package/lib/MSSA/SVFGBuilder.cpp +9 -27
  526. package/lib/MTA/MTA.cpp +4 -4
  527. package/lib/MemoryModel/PointerAnalysisImpl.cpp +10 -10
  528. package/lib/MemoryModel/PointsTo.cpp +23 -19
  529. package/lib/SVF-LLVM/LLVMLoopAnalysis.cpp +3 -4
  530. package/lib/SVF-LLVM/LLVMModule.cpp +32 -21
  531. package/lib/SVFIR/SVFIR.cpp +1 -1
  532. package/lib/SVFIR/SymbolTableInfo.cpp +4 -15
  533. package/lib/Util/Options.cpp +0 -6
  534. package/lib/WPA/AndersenSFR.cpp +1 -1
  535. package/lib/WPA/FlowSensitive.cpp +1 -1
  536. package/package.json +1 -1
  537. package/tools/CFL/cfl.cpp +5 -4
  538. package/tools/DDA/dda.cpp +3 -2
  539. package/tools/Example/svf-ex.cpp +3 -2
  540. package/tools/MTA/mta.cpp +6 -4
  541. package/tools/SABER/saber.cpp +7 -5
  542. package/tools/WPA/wpa.cpp +3 -2
@@ -66,9 +66,10 @@ $(function() {
66
66
  <div class="title">NodeIDAllocator.cpp</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="NodeIDAllocator_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===- NodeIDAllocator.cpp -- Allocates node IDs on request ------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="preprocessor">#include &lt;iomanip&gt;</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &lt;queue&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="fastcluster_8h.html">FastCluster/fastcluster.h</a>&quot;</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PointerAnalysisImpl_8h.html">MemoryModel/PointerAnalysisImpl.h</a>&quot;</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PTAStat_8h.html">Util/PTAStat.h</a>&quot;</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="NodeIDAllocator_8h.html">Util/NodeIDAllocator.h</a>&quot;</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFValue_8h.html">SVFIR/SVFValue.h</a>&quot;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFType_8h.html">SVFIR/SVFType.h</a>&quot;</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>&quot;</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;{</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a79ee84d7efb8abbfcd80d31d966ce20b">NodeIDAllocator::blackHoleObjectId</a> = 0;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a6a300a5b455fe4b8bace2f1d66fb5f9d">NodeIDAllocator::constantObjectId</a> = 1;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a535be344f97496d8086e2861ea6dc2ea">NodeIDAllocator::blackHolePointerId</a> = 2;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a1e3a98be74d5dfd3b4c1b5f9c0941353">NodeIDAllocator::nullPointerId</a> = 3;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;NodeIDAllocator *<a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">NodeIDAllocator::allocator</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#a2bd3ca30fc9669d9a0327544bdb4557b"> 25</a></span>&#160;<a class="code" href="classSVF_1_1NodeIDAllocator.html">NodeIDAllocator</a> *<a class="code" href="classSVF_1_1NodeIDAllocator.html#a2bd3ca30fc9669d9a0327544bdb4557b">NodeIDAllocator::get</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;{</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a> == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; {</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a> = <span class="keyword">new</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#ac8d6abc4ee27ae464f3978e4f4bdc3a6">NodeIDAllocator</a>();</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; }</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a>;</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;}</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#af7952ef5667039c9be86a589419b35a8"> 35</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#af7952ef5667039c9be86a589419b35a8">NodeIDAllocator::unset</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;{</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a> != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; {</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="keyword">delete</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; }</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;}</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">// Initialise counts to 4 because that&#39;s how many special nodes we have.</span></div><div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#ac8d6abc4ee27ae464f3978e4f4bdc3a6"> 45</a></span>&#160;<a class="code" href="classSVF_1_1NodeIDAllocator.html#ac8d6abc4ee27ae464f3978e4f4bdc3a6">NodeIDAllocator::NodeIDAllocator</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; : <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>(4), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a001c25f6998b8b0a9a7e5e00810e155f">numValues</a>(4), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a>(4), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>(4), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a>(<a class="code" href="classSVF_1_1Options.html">Options</a>::NodeAllocStrat)</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;{ }</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#a6ce6b40b8291c6378dda07d943d66e53"> 49</a></span>&#160;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a6ce6b40b8291c6378dda07d943d66e53">NodeIDAllocator::allocateObjectId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;{</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span> = 0;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DENSE)</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; {</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="comment">// We allocate objects from 0(-ish, considering the special nodes) to # of objects.</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; }</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::REVERSE_DENSE)</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; {</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordtype">id</span> = UINT_MAX - <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; }</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::SEQ)</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; {</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="comment">// Everything is sequential and intermixed.</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; }</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DEBUG)</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; {</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="comment">// Non-GEPs just grab the next available ID.</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="comment">// We may have &quot;holes&quot; because GEPs increment the total</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="comment">// but allocate far away. This is not a problem because</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="comment">// we don&#39;t care about the relative distances between nodes.</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; }</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; {</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateObjectId: unimplemented node allocation strategy.&quot;</span>);</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; }</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; assert(<span class="keywordtype">id</span> != 0 &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateObjectId: ID not allocated&quot;</span>);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;}</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#abaff066537f06c4891c199ebfc9624e3"> 86</a></span>&#160;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#abaff066537f06c4891c199ebfc9624e3">NodeIDAllocator::allocateGepObjectId</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> base, <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a>, <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> maxFieldLimit)</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;{</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span> = 0;</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DENSE)</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; {</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="comment">// Nothing different to the other case.</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; }</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::REVERSE_DENSE)</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; {</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordtype">id</span> = UINT_MAX - <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; }</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::SEQ)</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; {</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="comment">// Everything is sequential and intermixed.</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; }</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DEBUG)</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; {</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="comment">// For a gep id, base id is set at lower bits, and offset is set at higher bits</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="comment">// e.g., 1100050 denotes base=50 and offset=10</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="comment">// The offset is 10, not 11, because we add 1 to the offset to ensure that the</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="comment">// high bits are never 0. For example, we do not want the gep id to be 50 when</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">// the base is 50 and the offset is 0.</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> gepMultiplier = pow(10, ceil(log10(</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a> &gt; maxFieldLimit ?</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a> : maxFieldLimit</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; )));</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordtype">id</span> = (offset + 1) * gepMultiplier + base;</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; assert(<span class="keywordtype">id</span> &gt; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a> &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateGepObjectId: GEP allocation clashing with other nodes&quot;</span>);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; }</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; {</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateGepObjectId: unimplemented node allocation strategy&quot;</span>);</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; assert(<span class="keywordtype">id</span> != 0 &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateGepObjectId: ID not allocated&quot;</span>);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;}</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#a26b5e09e10448694435f74a8b622a7e8"> 129</a></span>&#160;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a26b5e09e10448694435f74a8b622a7e8">NodeIDAllocator::allocateValueId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;{</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span> = 0;</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DENSE)</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; {</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="comment">// We allocate values from UINT_MAX to UINT_MAX - # of values.</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="comment">// TODO: UINT_MAX does not allow for an easily changeable type</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="comment">// of NodeID (though it is already in use elsewhere).</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordtype">id</span> = UINT_MAX - <a class="code" href="classSVF_1_1NodeIDAllocator.html#a001c25f6998b8b0a9a7e5e00810e155f">numValues</a>;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::REVERSE_DENSE)</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; {</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a001c25f6998b8b0a9a7e5e00810e155f">numValues</a>;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; }</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::SEQ)</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; {</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="comment">// Everything is sequential and intermixed.</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; }</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DEBUG)</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; {</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateValueId: unimplemented node allocation strategy&quot;</span>);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a001c25f6998b8b0a9a7e5e00810e155f">numValues</a>;</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; assert(<span class="keywordtype">id</span> != 0 &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateValueId: ID not allocated&quot;</span>);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;}</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;</div><div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#a92b053f79cfa1259603836cb0aacad7d"> 164</a></span>&#160;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a92b053f79cfa1259603836cb0aacad7d">NodeIDAllocator::endSymbolAllocation</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;{</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a>;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;}</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afa74c5ccd22bebe0b76db33066d8b498">NodeIDAllocator::Clusterer::NumObjects</a> = <span class="stringliteral">&quot;NumObjects&quot;</span>;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad5f733cad8a103a64e80270acb67567a">NodeIDAllocator::Clusterer::RegioningTime</a> = <span class="stringliteral">&quot;RegioningTime&quot;</span>;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a09d2dbb2faab0a0e03bfa353534116a8">NodeIDAllocator::Clusterer::DistanceMatrixTime</a> = <span class="stringliteral">&quot;DistanceMatrixTime&quot;</span>;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ae78d2b60035350c634f6f58d7a043c22">NodeIDAllocator::Clusterer::FastClusterTime</a> = <span class="stringliteral">&quot;FastClusterTime&quot;</span>;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a67ab9cffacc1584b2e7bae5d1b08c541">NodeIDAllocator::Clusterer::DendrogramTraversalTime</a> = <span class="stringliteral">&quot;DendrogramTravTime&quot;</span>;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1d98862e19affdd08740f85490d0d856">NodeIDAllocator::Clusterer::EvalTime</a> = <span class="stringliteral">&quot;EvalTime&quot;</span>;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afef85f0ecacd681357b3945f97d52964">NodeIDAllocator::Clusterer::TotalTime</a> = <span class="stringliteral">&quot;TotalTime&quot;</span>;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a2a70b98363303cb33d96732f44b4c5c3">NodeIDAllocator::Clusterer::TheoreticalNumWords</a> = <span class="stringliteral">&quot;TheoreticalWords&quot;</span>;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#af2786eae11ee13845da336ad23bc97e9">NodeIDAllocator::Clusterer::OriginalBvNumWords</a> = <span class="stringliteral">&quot;OriginalBvWords&quot;</span>;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a639b887e30115c2a6cd108c65f18fcc1">NodeIDAllocator::Clusterer::OriginalSbvNumWords</a> = <span class="stringliteral">&quot;OriginalSbvWords&quot;</span>;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#af3fe4b4098898ee38928c9db30ea0fe9">NodeIDAllocator::Clusterer::NewBvNumWords</a> = <span class="stringliteral">&quot;NewBvWords&quot;</span>;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a779446e2fe92518401f1732fb809f066">NodeIDAllocator::Clusterer::NewSbvNumWords</a> = <span class="stringliteral">&quot;NewSbvWords&quot;</span>;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac5fe44f10cdbca9754444943a0f5c3c1">NodeIDAllocator::Clusterer::NumRegions</a> = <span class="stringliteral">&quot;NumRegions&quot;</span>;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad7cb36a1f0f67864fb8290e9dfd7b639">NodeIDAllocator::Clusterer::NumGtIntRegions</a> = <span class="stringliteral">&quot;NumGtIntRegions&quot;</span>;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a172d72ae4ae45fa2baf2f20ff2b499dc">NodeIDAllocator::Clusterer::LargestRegion</a> = <span class="stringliteral">&quot;LargestRegion&quot;</span>;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3556bdda6725b72d0ca88364daeae32e">NodeIDAllocator::Clusterer::BestCandidate</a> = <span class="stringliteral">&quot;BestCandidate&quot;</span>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1bf9461c717e8dabaee6a57f3d76d61f">NodeIDAllocator::Clusterer::NumNonTrivialRegionObjects</a> = <span class="stringliteral">&quot;NumNonTrivObj&quot;</span>;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b"> 188</a></span>&#160;std::vector&lt;NodeID&gt; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(<a class="code" href="classSVF_1_1BVDataPTAImpl.html">BVDataPTAImpl</a> *pta, <span class="keyword">const</span> std::vector&lt;std::pair&lt;NodeID, unsigned&gt;&gt; keys, std::vector&lt;std::pair&lt;<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a>, std::vector&lt;NodeID&gt;&gt;&gt; &amp;candidates, <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> evalSubtitle)</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;{</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; assert(pta != <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;Clusterer::cluster: given null BVDataPTAImpl&quot;</span>);</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; assert(<a class="code" href="classSVF_1_1Options.html#a2537be131132830c63d408133619a065">Options::NodeAllocStrat</a> == Strategy::DENSE &amp;&amp; <span class="stringliteral">&quot;Clusterer::cluster: only dense allocation clustering currently supported&quot;</span>);</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> overallStats;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordtype">double</span> fastClusterTime = 0.0;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordtype">double</span> distanceMatrixTime = 0.0;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keywordtype">double</span> dendrogramTraversalTime = 0.0;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keywordtype">double</span> regioningTime = 0.0;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordtype">double</span> evalTime = 0.0;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="comment">// Pair of nodes to their (minimum) distance and the number of occurrences of that distance.</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::pair&lt;NodeID, NodeID&gt;</a>, std::pair&lt;unsigned, unsigned&gt;&gt; distances;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordtype">double</span> clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="comment">// Map points-to sets to occurrences.</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;</a> pointsToSets;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="comment">// Objects each object shares at least a points-to set with.</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Set&lt;NodeID&gt;</a>&gt; coPointeeGraph;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair&lt;NodeID, unsigned&gt; &amp;keyOcc : keys)</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; {</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;pts = pta-&gt;<a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(keyOcc.first);</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldSize = pointsToSets.size();</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; pointsToSets[pts] += keyOcc.second;;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="comment">// Edges in this graph have no weight or uniqueness, so we only need to</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="comment">// do this for each points-to set once.</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keywordflow">if</span> (oldSize != pointsToSets.size())</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; {</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> firstO = !pts.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>() ? *(pts.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>()) : 0;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;NodeID&gt;</a> &amp;firstOsNeighbours = coPointeeGraph[firstO];</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; {</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">if</span> (o != firstO)</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; firstOsNeighbours.insert(o);</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; coPointeeGraph[o].insert(firstO);</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; }</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; }</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; }</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a2bd3ca30fc9669d9a0327544bdb4557b">NodeIDAllocator::get</a>()-&gt;<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; overallStats[NumObjects] = std::to_string(numObjects);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordtype">size_t</span> numRegions = 0;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; std::vector&lt;unsigned&gt; objectsRegion;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#ab6115b28808af348e1f6a6b58b4cd84f">Options::RegionedClustering</a>)</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; objectsRegion = regionObjects(coPointeeGraph, numObjects, numRegions);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; }</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; {</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="comment">// Just a single big region (0).</span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; objectsRegion.insert(objectsRegion.end(), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, 0);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; numRegions = 1;</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; }</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="comment">// Set needs to be ordered because getDistanceMatrix, in its n^2 iteration, expects</span></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="comment">// sets to be ordered (we are building a condensed matrix, not a full matrix, so it</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="comment">// matters). In getDistanceMatrix, doing regionReverseMapping for oi and oj, where</span></div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="comment">// oi &lt; oj, and getting a result moi &gt; moj gives incorrect results.</span></div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="comment">// In the condensed matrix, [b][a] where b &gt;= a, is incorrect.</span></div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; std::vector&lt;OrderedSet&lt;NodeID&gt;&gt; regionsObjects(numRegions);</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o = 0; o &lt; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>; ++o) regionsObjects[objectsRegion[o]].insert(o);</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160;</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="comment">// Size of the return node mapping. It is potentially larger than the number of</span></div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="comment">// objects because we align each region to NATIVE_INT_SIZE.</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="comment">// size_t numMappings = 0;</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="comment">// Maps a region to a mapping which maps 0 to n to all objects</span></div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="comment">// in that region.</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; std::vector&lt;std::vector&lt;NodeID&gt;&gt; regionMappings(numRegions);</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="comment">// The reverse: region to mapping of objects to a 0 to n from above.</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; std::vector&lt;Map&lt;NodeID, unsigned&gt;&gt; regionReverseMappings(numRegions);</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="comment">// We can thus use 0 to n for each region to create smaller distance matrices.</span></div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> region = 0; region &lt; numRegions; ++region)</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; {</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordtype">size_t</span> curr = 0;</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="comment">// With the OrderedSet above, o1 &lt; o2 =&gt; map[o1] &lt; map[o2].</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : regionsObjects[region])</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; {</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="comment">// push_back here is just like p...[region][curr] = o.</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; regionMappings[region].push_back(o);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; regionReverseMappings[region][o] = curr++;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; }</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="comment">// curr is the number of objects. A region with no objects makes no sense.</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; assert(curr != 0);</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="comment">// Number of bits needed for this region if we were</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="comment">// to start assigning from 0 rounded up to the fewest needed</span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="comment">// native ints. This is added to the number of mappings since</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="comment">// we align each region to a native int.</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="comment">// numMappings += requiredBits(regionsObjects[region].size());</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; }</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="comment">// Points-to sets which are relevant to a region, i.e., those whose elements</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="comment">// belong to that region. Pair is for occurences.</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; std::vector&lt;std::vector&lt;std::pair&lt;const PointsTo *, unsigned&gt;&gt;&gt; regionsPointsTos(numRegions);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;::value_type</a> &amp;ptocc : pointsToSets)</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; {</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;pt = ptocc.first;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keyword">const</span> <span class="keywordtype">unsigned</span> occ = ptocc.second;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keywordflow">if</span> (pt.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="comment">// Guaranteed that begin() != end() because of the continue above. All objects in pt</span></div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="comment">// will be relevant to the same region.</span></div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keywordtype">unsigned</span> region = objectsRegion[*(pt.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>())];</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <span class="comment">// In our &quot;graph&quot;, objects in the same points-to set have an edge between them,</span></div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="comment">// so they are all in the same connected component/region.</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; regionsPointsTos[region].push_back(std::make_pair(&amp;pt, occ));</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; }</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordtype">double</span> clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; regioningTime = (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; overallStats[RegioningTime] = std::to_string(regioningTime);</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; overallStats[NumRegions] = std::to_string(numRegions);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; std::vector&lt;hclust_fast_methods&gt; methods;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8e0538a7f2e3c5bece69bc69f7074819">Options::ClusterMethod</a> == <a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda66ab3fde95842ef6da0dae1f702a9618">HCLUST_METHOD_SVF_BEST</a>)</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; {</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; methods.push_back(<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913ddad16cc6362447cc32292c4af4c6fe8024">HCLUST_METHOD_SINGLE</a>);</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; methods.push_back(<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda44ce22fdfc560f27242e9b8f8e7009f4">HCLUST_METHOD_COMPLETE</a>);</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; methods.push_back(<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda3ab72664fc61704a1ba46bddbc347115">HCLUST_METHOD_AVERAGE</a>);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; {</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; methods.push_back(<a class="code" href="classSVF_1_1Options.html#a8e0538a7f2e3c5bece69bc69f7074819">Options::ClusterMethod</a>);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; }</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a> method : methods)</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; std::vector&lt;NodeID&gt; nodeMap(numObjects, UINT_MAX);</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160;</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keywordtype">unsigned</span> numGtIntRegions = 0;</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="keywordtype">unsigned</span> largestRegion = 0;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keywordtype">unsigned</span> nonTrivialRegionObjects = 0;</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keywordtype">unsigned</span> allocCounter = 0;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> region = 0; region &lt; numRegions; ++region)</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; {</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> regionNumObjects = regionsObjects[region].size();</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="comment">// Round up to next Word: ceiling of current allocation to get how</span></div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="comment">// many words and multiply to get the number of bits; if we&#39;re aligning.</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a88550ed8c4ec2ccc5d5e40869499787b">Options::RegionAlign</a>)</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; {</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; allocCounter =</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; ((allocCounter + <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a> - 1) / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>) * <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; }</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keywordflow">if</span> (regionNumObjects &gt; largestRegion) largestRegion = regionNumObjects;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="comment">// For regions with fewer than 64 objects, we can just allocate them</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">// however as they will be in the one int regardless..</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">if</span> (regionNumObjects &lt; <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>)</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; {</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : regionsObjects[region]) nodeMap[o] = allocCounter++;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; }</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; ++numGtIntRegions;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; nonTrivialRegionObjects += regionNumObjects;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160;</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="keywordtype">double</span> *distMatrix = getDistanceMatrix(regionsPointsTos[region], regionNumObjects,</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; regionReverseMappings[region], distanceMatrixTime);</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keywordtype">int</span> *dendrogram = <span class="keyword">new</span> <span class="keywordtype">int</span>[2 * (regionNumObjects - 1)];</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="keywordtype">double</span> *height = <span class="keyword">new</span> <span class="keywordtype">double</span>[regionNumObjects - 1];</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <a class="code" href="fastcluster_8h.html#acccd226cbdf0944b5c9e24c84a4599c9">hclust_fast</a>(regionNumObjects, distMatrix, method, dendrogram, height);</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="keyword">delete</span>[] distMatrix;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keyword">delete</span>[] height;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; fastClusterTime += (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160;</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;int&gt;</a> visited;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; traverseDendrogram(nodeMap, dendrogram, regionNumObjects, allocCounter,</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; visited, regionNumObjects - 1, regionMappings[region]);</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keyword">delete</span>[] dendrogram;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; dendrogramTraversalTime += (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; }</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; candidates.push_back(std::make_pair(method, nodeMap));</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="comment">// Though we &quot;update&quot; these in the loop, they will be the same every iteration.</span></div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; overallStats[NumGtIntRegions] = std::to_string(numGtIntRegions);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; overallStats[LargestRegion] = std::to_string(largestRegion);</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; overallStats[NumNonTrivialRegionObjects] = std::to_string(nonTrivialRegionObjects);</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; }</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="comment">// Work out which of the mappings we generated looks best.</span></div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; std::pair&lt;hclust_fast_methods, std::vector&lt;NodeID&gt;&gt; bestMapping = determineBestMapping(candidates, pointsToSets,</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; evalSubtitle, evalTime);</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; overallStats[DistanceMatrixTime] = std::to_string(distanceMatrixTime);</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; overallStats[DendrogramTraversalTime] = std::to_string(dendrogramTraversalTime);</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; overallStats[FastClusterTime] = std::to_string(fastClusterTime);</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; overallStats[EvalTime] = std::to_string(evalTime);</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; overallStats[TotalTime] = std::to_string(distanceMatrixTime + dendrogramTraversalTime + fastClusterTime + regioningTime + evalTime);</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160;</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; overallStats[BestCandidate] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a14a4c5124f2fd03ca3d898e2acd54160">SVFUtil::hclustMethodToString</a>(bestMapping.first);</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; printStats(evalSubtitle + <span class="stringliteral">&quot;: overall&quot;</span>, overallStats);</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keywordflow">return</span> bestMapping.second;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160;}</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160;</div><div class="line"><a name="l00398"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f"> 398</a></span>&#160;std::vector&lt;NodeID&gt; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(<span class="keyword">const</span> std::vector&lt;NodeID&gt; &amp;nodeMapping)</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160;{</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="comment">// nodeMapping.size() may not be big enough because we leave some gaps, but it&#39;s a start.</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; std::vector&lt;NodeID&gt; reverseNodeMapping(nodeMapping.size(), UINT_MAX);</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; nodeMapping.size(); ++i)</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; {</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> mapsTo = nodeMapping.at(i);</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="keywordflow">if</span> (mapsTo &gt;= reverseNodeMapping.size()) reverseNodeMapping.resize(mapsTo + 1, UINT_MAX);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; reverseNodeMapping.at(mapsTo) = i;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; }</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordflow">return</span> reverseNodeMapping;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160;}</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160;</div><div class="line"><a name="l00412"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac8c209af1d177cbc8fbbfe4526fe8ce2"> 412</a></span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac8c209af1d177cbc8fbbfe4526fe8ce2">NodeIDAllocator::Clusterer::condensedIndex</a>(<span class="keywordtype">size_t</span> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>, <span class="keywordtype">size_t</span> i, <span class="keywordtype">size_t</span> j)</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160;{</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="comment">// From https://stackoverflow.com/a/14839010</span></div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keywordflow">return</span> n*(n-1)/2 - (n-i)*(n-i-1)/2 + j - i - 1;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160;}</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160;</div><div class="line"><a name="l00418"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a9aea96839c51ac1e2cbf4813174bb21c"> 418</a></span>&#160;<span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a9aea96839c51ac1e2cbf4813174bb21c">NodeIDAllocator::Clusterer::requiredBits</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;pts)</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;{</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">return</span> requiredBits(pts.<a class="code" href="classSVF_1_1PointsTo.html#a879783ba6629e500af9aa7dfcda2563d">count</a>());</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160;}</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160;</div><div class="line"><a name="l00423"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad0f0a6b61a044db819c253f8b9ab093e"> 423</a></span>&#160;<span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a9aea96839c51ac1e2cbf4813174bb21c">NodeIDAllocator::Clusterer::requiredBits</a>(<span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>)</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160;{</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">if</span> (n == 0) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="comment">// Ceiling of number of bits amongst each native integer gives needed native ints,</span></div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="comment">// so we then multiply again by the number of bits in each native int.</span></div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordflow">return</span> ((n - 1) / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a> + 1) * <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>;</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160;}</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;</div><div class="line"><a name="l00431"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#adf415d244ef1fafe7a7de3c360553c0f"> 431</a></span>&#160;<span class="keywordtype">double</span> *<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#adf415d244ef1fafe7a7de3c360553c0f">NodeIDAllocator::Clusterer::getDistanceMatrix</a>(<span class="keyword">const</span> std::vector&lt;std::pair&lt;const PointsTo *, unsigned&gt;&gt; pointsToSets,</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, unsigned&gt;</a> &amp;nodeMap,</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordtype">double</span> &amp;distanceMatrixTime)</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;{</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keywordtype">size_t</span> condensedSize = (numObjects * (numObjects - 1)) / 2;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keywordtype">double</span> *distMatrix = <span class="keyword">new</span> <span class="keywordtype">double</span>[condensedSize];</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; condensedSize; ++i) distMatrix[i] = numObjects * numObjects;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="comment">// TODO: maybe use machine epsilon?</span></div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="comment">// For reducing distance due to extra occurrences.</span></div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="comment">// Can differentiate ~9999 occurrences.</span></div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordtype">double</span> occurrenceEpsilon = 0.0001;</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160;</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair&lt;const PointsTo *, unsigned&gt; &amp;ptsOcc : pointsToSets)</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; {</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> *pts = ptsOcc.first;</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; assert(pts != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keyword">const</span> <span class="keywordtype">unsigned</span> occ = ptsOcc.second;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="comment">// Distance between each element of pts.</span></div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="keywordtype">unsigned</span> distance = requiredBits(*pts) / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>;</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="comment">// Use a vector so we can index into pts.</span></div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; std::vector&lt;NodeID&gt; ptsVec;</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : *pts) ptsVec.push_back(o);</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; ptsVec.size(); ++i)</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; {</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> oi = ptsVec[i];</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, unsigned&gt;::const_iterator</a> moi = nodeMap.find(oi);</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; assert(moi != nodeMap.end());</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = i + 1; j &lt; ptsVec.size(); ++j)</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; {</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> oj = ptsVec[j];</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, unsigned&gt;::const_iterator</a> moj = nodeMap.find(oj);</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; assert(moj != nodeMap.end());</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keywordtype">double</span> &amp;existingDistance = distMatrix[condensedIndex(numObjects, moi-&gt;second, moj-&gt;second)];</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160;</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="comment">// Subtract extra occurrenceEpsilon to make upcoming logic simpler.</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">// When existingDistance is never whole, it is always between two distances.</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">if</span> (distance &lt; existingDistance) existingDistance = distance - occurrenceEpsilon;</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordflow">if</span> (distance == std::ceil(existingDistance))</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; {</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="comment">// We have something like distance == x, existingDistance == x - e, for some e &lt; 1</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="comment">// (potentially even set during this iteration).</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="comment">// So, the new distance is an occurrence the existingDistance being tracked, it just</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <span class="comment">// had some reductions because of multiple occurences.</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="comment">// If there is not room within this distance to reduce more (increase priority),</span></div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="comment">// just ignore it. TODO: maybe warn?</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="keywordflow">if</span> (existingDistance - occ * occurrenceEpsilon &gt; std::floor(existingDistance))</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; {</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; existingDistance -= occ * occurrenceEpsilon;</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; }</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="comment">// Reached minimum.</span></div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; existingDistance = std::floor(existingDistance) + occurrenceEpsilon;</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; }</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; }</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; }</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160;</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; }</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160;</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; distanceMatrixTime += (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordflow">return</span> distMatrix;</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160;}</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;</div><div class="line"><a name="l00502"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#abd44e3b07b0482bacf6b1a080fe650c6"> 502</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#abd44e3b07b0482bacf6b1a080fe650c6">NodeIDAllocator::Clusterer::traverseDendrogram</a>(std::vector&lt;NodeID&gt; &amp;nodeMap, <span class="keyword">const</span> <span class="keywordtype">int</span> *dendrogram, <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, <span class="keywordtype">unsigned</span> &amp;allocCounter, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;int&gt;</a> &amp;visited, <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, <span class="keyword">const</span> std::vector&lt;NodeID&gt; &amp;regionNodeMap)</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160;{</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keywordflow">if</span> (visited.find(index) != visited.end()) <span class="keywordflow">return</span>;</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; visited.insert(index);</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160;</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="keywordtype">int</span> left = dendrogram[index - 1];</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keywordflow">if</span> (left &lt; 0)</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; {</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="comment">// Reached a leaf.</span></div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="comment">// -1 because the items start from 1 per fastcluster (TODO).</span></div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; nodeMap[regionNodeMap[std::abs(left) - 1]] = allocCounter;</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; ++allocCounter;</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; }</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; {</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; traverseDendrogram(nodeMap, dendrogram, numObjects, allocCounter, visited, left, regionNodeMap);</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; }</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160;</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="comment">// Repeat for the right child.</span></div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keywordtype">int</span> right = dendrogram[(numObjects - 1) + index - 1];</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keywordflow">if</span> (right &lt; 0)</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; {</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; nodeMap[regionNodeMap[std::abs(right) - 1]] = allocCounter;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; ++allocCounter;</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; }</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; {</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; traverseDendrogram(nodeMap, dendrogram, numObjects, allocCounter, visited, right, regionNodeMap);</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;}</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160;</div><div class="line"><a name="l00533"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a7d34542f34a8e8008119c3d61943daa2"> 533</a></span>&#160;std::vector&lt;NodeID&gt; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a7d34542f34a8e8008119c3d61943daa2">NodeIDAllocator::Clusterer::regionObjects</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a>, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;NodeID&gt;</a>&gt; &amp;graph, <span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, <span class="keywordtype">size_t</span> &amp;numLabels)</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;{</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="keywordtype">unsigned</span> label = UINT_MAX;</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; std::vector&lt;NodeID&gt; labels(numObjects, UINT_MAX);</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;NodeID&gt;</a> labelled;</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a>, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;NodeID&gt;</a>&gt;::value_type &amp;oos : graph)</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; {</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o = oos.first;</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="keywordflow">if</span> (labels[o] != UINT_MAX) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; std::queue&lt;NodeID&gt; bfsQueue;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; bfsQueue.push(o);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; ++label;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="keywordflow">while</span> (!bfsQueue.empty())</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; {</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o = bfsQueue.front();</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; bfsQueue.pop();</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">if</span> (labels[o] != UINT_MAX)</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; {</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; assert(labels[o] == label);</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; }</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; labels[o] = label;</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Set&lt;NodeID&gt;</a>&gt;::const_iterator neighboursIt = graph.find(o);</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; assert(neighboursIt != graph.end());</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> neighbour : neighboursIt-&gt;second) bfsQueue.push(neighbour);</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; }</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; }</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="comment">// The remaining objects have no relation with others: they get their own label.</span></div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> o = 0; o &lt; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>; ++o)</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; {</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="keywordflow">if</span> (labels[o] == UINT_MAX) labels[o] = ++label;</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; }</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160;</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; numLabels = label + 1;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keywordflow">return</span> labels;</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160;}</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160;</div><div class="line"><a name="l00573"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba"> 573</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba">NodeIDAllocator::Clusterer::evaluate</a>(<span class="keyword">const</span> std::vector&lt;NodeID&gt; &amp;nodeMap, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;</a> pointsToSets, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> &amp;stats, <span class="keywordtype">bool</span> accountForOcc)</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160;{</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalTheoretical = 0;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalOriginalSbv = 0;</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalOriginalBv = 0;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalNewSbv = 0;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalNewBv = 0;</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160;</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;::value_type</a> &amp;ptsOcc : pointsToSets)</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; {</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;pts = ptsOcc.first;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keyword">const</span> <span class="keywordtype">unsigned</span> occ = ptsOcc.second;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keywordflow">if</span> (pts.<a class="code" href="classSVF_1_1PointsTo.html#a879783ba6629e500af9aa7dfcda2563d">count</a>() == 0) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160;</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> theoretical = requiredBits(pts) / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="keywordflow">if</span> (accountForOcc) theoretical *= occ;</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="comment">// Check number of words for original SBV.</span></div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;unsigned&gt;</a> words;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <span class="comment">// TODO: nasty hardcoding.</span></div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts) words.insert(o / 128);</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> originalSbv = words.size() * 2;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="keywordflow">if</span> (accountForOcc) originalSbv *= occ;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="comment">// Check number of words for original BV.</span></div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> min = UINT_MAX;</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> max = 0;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; {</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; <span class="keywordflow">if</span> (o &lt; min) min = o;</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <span class="keywordflow">if</span> (o &gt; max) max = o;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; }</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; words.clear();</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> = min; <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> &lt;= max; ++<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; {</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; words.insert(<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>);</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; }</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> originalBv = words.size();</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="keywordflow">if</span> (accountForOcc) originalBv *= occ;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <span class="comment">// Check number of words for new SBV.</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; words.clear();</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <span class="comment">// TODO: nasty hardcoding.</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts) words.insert(nodeMap[o] / 128);</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> newSbv = words.size() * 2;</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; <span class="keywordflow">if</span> (accountForOcc) newSbv *= occ;</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160;</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; <span class="comment">// Check number of words for new BV.</span></div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; min = UINT_MAX;</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; max = 0;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; {</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> mappedO = nodeMap[o];</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keywordflow">if</span> (mappedO &lt; min) min = mappedO;</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="keywordflow">if</span> (mappedO &gt; max) max = mappedO;</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; }</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; words.clear();</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="comment">// No nodeMap[b] because min and max and from nodeMap.</span></div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> = min; <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> &lt;= max; ++<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>) words.insert(<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> newBv = words.size();</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keywordflow">if</span> (accountForOcc) newBv *= occ;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160;</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; totalTheoretical += theoretical;</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; totalOriginalSbv += originalSbv;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; totalOriginalBv += originalBv;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; totalNewSbv += newSbv;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; totalNewBv += newBv;</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; }</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160;</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; stats[TheoreticalNumWords] = std::to_string(totalTheoretical);</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; stats[OriginalSbvNumWords] = std::to_string(totalOriginalSbv);</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; stats[OriginalBvNumWords] = std::to_string(totalOriginalBv);</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; stats[NewSbvNumWords] = std::to_string(totalNewSbv);</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; stats[NewBvNumWords] = std::to_string(totalNewBv);</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160;}</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160;<span class="comment">// Work out which of the mappings we generated looks best.</span></div><div class="line"><a name="l00651"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3f86e733cc075180e9682887c554b8fa"> 651</a></span>&#160;std::pair&lt;hclust_fast_methods, std::vector&lt;NodeID&gt;&gt; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3f86e733cc075180e9682887c554b8fa">NodeIDAllocator::Clusterer::determineBestMapping</a>(</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="keyword">const</span> std::vector&lt;std::pair&lt;<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a>, std::vector&lt;NodeID&gt;&gt;&gt; &amp;candidates,</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;</a> pointsToSets, <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;evalSubtitle, <span class="keywordtype">double</span> &amp;evalTime)</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160;{</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; <span class="comment">// In case we&#39;re not comparing anything, set to first &quot;candidate&quot;.</span></div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; std::pair&lt;hclust_fast_methods, std::vector&lt;NodeID&gt;&gt; bestMapping = candidates[0];</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <span class="comment">// Number of bits required for the best candidate.</span></div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="keywordtype">size_t</span> bestWords = std::numeric_limits&lt;size_t&gt;::max();</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="keywordflow">if</span> (evalSubtitle != <span class="stringliteral">&quot;&quot;</span> || <a class="code" href="classSVF_1_1Options.html#a8e0538a7f2e3c5bece69bc69f7074819">Options::ClusterMethod</a> == <a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda66ab3fde95842ef6da0dae1f702a9618">HCLUST_METHOD_SVF_BEST</a>)</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; {</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair&lt;<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a>, std::vector&lt;NodeID&gt;&gt; &amp;candidate : candidates)</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; {</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> candidateStats;</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a> candidateMethod = candidate.first;</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> candidateMethodName = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a14a4c5124f2fd03ca3d898e2acd54160">SVFUtil::hclustMethodToString</a>(candidateMethod);</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; std::vector&lt;NodeID&gt; candidateMapping = candidate.second;</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160;</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <span class="comment">// TODO: parameterise final arg.</span></div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; evaluate(candidateMapping, pointsToSets, candidateStats, <span class="keyword">true</span>);</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; evalTime += (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; printStats(evalSubtitle + <span class="stringliteral">&quot;: candidate &quot;</span> + candidateMethodName, candidateStats);</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160;</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; <span class="keywordtype">size_t</span> candidateWords = 0;</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#abc02c7dc5e6cb3613856e0f774c6d304">Options::PtType</a> == <a class="code" href="classSVF_1_1PointsTo.html#a8f757f92ebf0a2ebdb5e6b001606923eacccb6e19f3e8db5f5b5b8858b22da61a">PointsTo::SBV</a>) candidateWords = std::stoull(candidateStats[NewSbvNumWords]);</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#abc02c7dc5e6cb3613856e0f774c6d304">Options::PtType</a> == <a class="code" href="classSVF_1_1PointsTo.html#a8f757f92ebf0a2ebdb5e6b001606923ea0397c2678894d1792fcd3432a7aa64fb">PointsTo::CBV</a>) candidateWords = std::stoull(candidateStats[NewBvNumWords]);</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <span class="keywordflow">else</span> assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;Clusterer::cluster: unsupported BV type for clustering.&quot;</span>);</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160;</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <span class="keywordflow">if</span> (candidateWords &lt; bestWords)</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; {</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; bestWords = candidateWords;</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; bestMapping = candidate;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; }</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; }</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; }</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <span class="keywordflow">return</span> bestMapping;</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160;}</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160;</div><div class="line"><a name="l00691"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7"> 691</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">NodeIDAllocator::Clusterer::printStats</a>(<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> subtitle, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> &amp;stats)</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160;{</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="comment">// When not in order, it is too hard to compare original/new SBV/BV words, so this array forces an order.</span></div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="keyword">const</span> <span class="keyword">static</span> std::array&lt;std::string, 17&gt; statKeys =</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; {</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; NumObjects, TheoreticalNumWords, OriginalSbvNumWords, OriginalBvNumWords,</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; NewSbvNumWords, NewBvNumWords, NumRegions, NumGtIntRegions,</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; NumNonTrivialRegionObjects, LargestRegion, RegioningTime,</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; DistanceMatrixTime, FastClusterTime, DendrogramTraversalTime,</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; EvalTime, TotalTime, BestCandidate</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; };</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160;</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <span class="keyword">const</span> <span class="keywordtype">unsigned</span> fieldWidth = 20;</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flags(std::ios::left);</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;****Clusterer Statistics: &quot;</span> &lt;&lt; subtitle &lt;&lt; <span class="stringliteral">&quot;****\n&quot;</span>;</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;statKey : statKeys)</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; {</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;::const_iterator</a> stat = stats.find(statKey);</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; <span class="keywordflow">if</span> (stat != stats.end())</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; {</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; std::setw(fieldWidth) &lt;&lt; statKey &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; stat-&gt;second &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; }</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; }</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160;</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flush();</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160;}</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160;</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160;}; <span class="comment">// namespace SVF.</span></div><div class="ttc" id="classSVF_1_1BVDataPTAImpl_html"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html">SVF::BVDataPTAImpl</a></div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00042">PointerAnalysisImpl.h:42</a></div></div>
69
+ <a href="NodeIDAllocator_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===- NodeIDAllocator.cpp -- Allocates node IDs on request ------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="preprocessor">#include &lt;iomanip&gt;</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &lt;queue&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="fastcluster_8h.html">FastCluster/fastcluster.h</a>&quot;</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PointerAnalysisImpl_8h.html">MemoryModel/PointerAnalysisImpl.h</a>&quot;</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PTAStat_8h.html">Util/PTAStat.h</a>&quot;</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="NodeIDAllocator_8h.html">Util/NodeIDAllocator.h</a>&quot;</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFValue_8h.html">SVFIR/SVFValue.h</a>&quot;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFType_8h.html">SVFIR/SVFType.h</a>&quot;</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>&quot;</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;{</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a79ee84d7efb8abbfcd80d31d966ce20b">NodeIDAllocator::blackHoleObjectId</a> = 0;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a6a300a5b455fe4b8bace2f1d66fb5f9d">NodeIDAllocator::constantObjectId</a> = 1;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a535be344f97496d8086e2861ea6dc2ea">NodeIDAllocator::blackHolePointerId</a> = 2;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a1e3a98be74d5dfd3b4c1b5f9c0941353">NodeIDAllocator::nullPointerId</a> = 3;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;NodeIDAllocator *<a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">NodeIDAllocator::allocator</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#a2bd3ca30fc9669d9a0327544bdb4557b"> 25</a></span>&#160;<a class="code" href="classSVF_1_1NodeIDAllocator.html">NodeIDAllocator</a> *<a class="code" href="classSVF_1_1NodeIDAllocator.html#a2bd3ca30fc9669d9a0327544bdb4557b">NodeIDAllocator::get</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;{</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a> == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; {</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a> = <span class="keyword">new</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#ac8d6abc4ee27ae464f3978e4f4bdc3a6">NodeIDAllocator</a>();</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; }</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a>;</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;}</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#af7952ef5667039c9be86a589419b35a8"> 35</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#af7952ef5667039c9be86a589419b35a8">NodeIDAllocator::unset</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;{</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a> != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; {</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="keyword">delete</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">allocator</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; }</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;}</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment">// Initialise counts to 4 because that&#39;s how many special nodes we have.</span></div><div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#ac8d6abc4ee27ae464f3978e4f4bdc3a6"> 45</a></span>&#160;<a class="code" href="classSVF_1_1NodeIDAllocator.html#ac8d6abc4ee27ae464f3978e4f4bdc3a6">NodeIDAllocator::NodeIDAllocator</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; : <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>(4), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a001c25f6998b8b0a9a7e5e00810e155f">numValues</a>(4), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a>(4), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>(4), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a>(<a class="code" href="classSVF_1_1Options.html">Options</a>::NodeAllocStrat)</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;{ }</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#a6ce6b40b8291c6378dda07d943d66e53"> 49</a></span>&#160;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a6ce6b40b8291c6378dda07d943d66e53">NodeIDAllocator::allocateObjectId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;{</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span> = 0;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DENSE)</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; {</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="comment">// We allocate objects from 0(-ish, considering the special nodes) to # of objects.</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; }</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::REVERSE_DENSE)</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; {</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordtype">id</span> = UINT_MAX - <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; }</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::SEQ)</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; {</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="comment">// Everything is sequential and intermixed.</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; }</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DEBUG)</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; {</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="comment">// Non-GEPs just grab the next available ID.</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="comment">// We may have &quot;holes&quot; because GEPs increment the total</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="comment">// but allocate far away. This is not a problem because</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="comment">// we don&#39;t care about the relative distances between nodes.</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; }</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; {</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateObjectId: unimplemented node allocation strategy.&quot;</span>);</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; }</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; assert(<span class="keywordtype">id</span> != 0 &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateObjectId: ID not allocated&quot;</span>);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;}</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#abaff066537f06c4891c199ebfc9624e3"> 86</a></span>&#160;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#abaff066537f06c4891c199ebfc9624e3">NodeIDAllocator::allocateGepObjectId</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> base, <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a>, <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> maxFieldLimit)</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;{</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span> = 0;</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DENSE)</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; {</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="comment">// Nothing different to the other case.</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; }</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::REVERSE_DENSE)</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; {</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordtype">id</span> = UINT_MAX - <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; }</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::SEQ)</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; {</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="comment">// Everything is sequential and intermixed.</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; }</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DEBUG)</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; {</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="comment">// For a gep id, base id is set at lower bits, and offset is set at higher bits</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="comment">// e.g., 1100050 denotes base=50 and offset=10</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="comment">// The offset is 10, not 11, because we add 1 to the offset to ensure that the</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="comment">// high bits are never 0. For example, we do not want the gep id to be 50 when</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">// the base is 50 and the offset is 0.</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> gepMultiplier = pow(10, ceil(log10(</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a> &gt; maxFieldLimit ?</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a> : maxFieldLimit</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; )));</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordtype">id</span> = (offset + 1) * gepMultiplier + base;</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; assert(<span class="keywordtype">id</span> &gt; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a> &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateGepObjectId: GEP allocation clashing with other nodes&quot;</span>);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; }</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; {</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateGepObjectId: unimplemented node allocation strategy&quot;</span>);</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; assert(<span class="keywordtype">id</span> != 0 &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateGepObjectId: ID not allocated&quot;</span>);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;}</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#a26b5e09e10448694435f74a8b622a7e8"> 129</a></span>&#160;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a26b5e09e10448694435f74a8b622a7e8">NodeIDAllocator::allocateValueId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;{</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span> = 0;</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DENSE)</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; {</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="comment">// We allocate values from UINT_MAX to UINT_MAX - # of values.</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="comment">// TODO: UINT_MAX does not allow for an easily changeable type</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="comment">// of NodeID (though it is already in use elsewhere).</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordtype">id</span> = UINT_MAX - <a class="code" href="classSVF_1_1NodeIDAllocator.html#a001c25f6998b8b0a9a7e5e00810e155f">numValues</a>;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::REVERSE_DENSE)</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; {</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a001c25f6998b8b0a9a7e5e00810e155f">numValues</a>;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; }</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::SEQ)</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; {</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="comment">// Everything is sequential and intermixed.</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; }</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">strategy</a> == Strategy::DEBUG)</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; {</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateValueId: unimplemented node allocation strategy&quot;</span>);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a001c25f6998b8b0a9a7e5e00810e155f">numValues</a>;</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; ++<a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; assert(<span class="keywordtype">id</span> != 0 &amp;&amp; <span class="stringliteral">&quot;NodeIDAllocator::allocateValueId: ID not allocated&quot;</span>);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;}</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;</div><div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator.html#a92b053f79cfa1259603836cb0aacad7d"> 164</a></span>&#160;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a92b053f79cfa1259603836cb0aacad7d">NodeIDAllocator::endSymbolAllocation</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;{</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a8e76e0da58f0a5bdbd8118ac419cfa62">numNodes</a>;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">numSymbols</a>;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;}</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afa74c5ccd22bebe0b76db33066d8b498">NodeIDAllocator::Clusterer::NumObjects</a> = <span class="stringliteral">&quot;NumObjects&quot;</span>;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad5f733cad8a103a64e80270acb67567a">NodeIDAllocator::Clusterer::RegioningTime</a> = <span class="stringliteral">&quot;RegioningTime&quot;</span>;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a09d2dbb2faab0a0e03bfa353534116a8">NodeIDAllocator::Clusterer::DistanceMatrixTime</a> = <span class="stringliteral">&quot;DistanceMatrixTime&quot;</span>;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ae78d2b60035350c634f6f58d7a043c22">NodeIDAllocator::Clusterer::FastClusterTime</a> = <span class="stringliteral">&quot;FastClusterTime&quot;</span>;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a67ab9cffacc1584b2e7bae5d1b08c541">NodeIDAllocator::Clusterer::DendrogramTraversalTime</a> = <span class="stringliteral">&quot;DendrogramTravTime&quot;</span>;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1d98862e19affdd08740f85490d0d856">NodeIDAllocator::Clusterer::EvalTime</a> = <span class="stringliteral">&quot;EvalTime&quot;</span>;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afef85f0ecacd681357b3945f97d52964">NodeIDAllocator::Clusterer::TotalTime</a> = <span class="stringliteral">&quot;TotalTime&quot;</span>;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a2a70b98363303cb33d96732f44b4c5c3">NodeIDAllocator::Clusterer::TheoreticalNumWords</a> = <span class="stringliteral">&quot;TheoreticalWords&quot;</span>;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#af2786eae11ee13845da336ad23bc97e9">NodeIDAllocator::Clusterer::OriginalBvNumWords</a> = <span class="stringliteral">&quot;OriginalBvWords&quot;</span>;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a639b887e30115c2a6cd108c65f18fcc1">NodeIDAllocator::Clusterer::OriginalSbvNumWords</a> = <span class="stringliteral">&quot;OriginalSbvWords&quot;</span>;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#af3fe4b4098898ee38928c9db30ea0fe9">NodeIDAllocator::Clusterer::NewBvNumWords</a> = <span class="stringliteral">&quot;NewBvWords&quot;</span>;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a779446e2fe92518401f1732fb809f066">NodeIDAllocator::Clusterer::NewSbvNumWords</a> = <span class="stringliteral">&quot;NewSbvWords&quot;</span>;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac5fe44f10cdbca9754444943a0f5c3c1">NodeIDAllocator::Clusterer::NumRegions</a> = <span class="stringliteral">&quot;NumRegions&quot;</span>;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad7cb36a1f0f67864fb8290e9dfd7b639">NodeIDAllocator::Clusterer::NumGtIntRegions</a> = <span class="stringliteral">&quot;NumGtIntRegions&quot;</span>;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a172d72ae4ae45fa2baf2f20ff2b499dc">NodeIDAllocator::Clusterer::LargestRegion</a> = <span class="stringliteral">&quot;LargestRegion&quot;</span>;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3556bdda6725b72d0ca88364daeae32e">NodeIDAllocator::Clusterer::BestCandidate</a> = <span class="stringliteral">&quot;BestCandidate&quot;</span>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1bf9461c717e8dabaee6a57f3d76d61f">NodeIDAllocator::Clusterer::NumNonTrivialRegionObjects</a> = <span class="stringliteral">&quot;NumNonTrivObj&quot;</span>;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b"> 188</a></span>&#160;std::vector&lt;NodeID&gt; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(<a class="code" href="classSVF_1_1BVDataPTAImpl.html">BVDataPTAImpl</a> *pta, <span class="keyword">const</span> std::vector&lt;std::pair&lt;NodeID, unsigned&gt;&gt; keys, std::vector&lt;std::pair&lt;<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a>, std::vector&lt;NodeID&gt;&gt;&gt; &amp;candidates, <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> evalSubtitle)</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;{</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; assert(pta != <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;Clusterer::cluster: given null BVDataPTAImpl&quot;</span>);</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; assert(<a class="code" href="classSVF_1_1Options.html#a2537be131132830c63d408133619a065">Options::NodeAllocStrat</a> == Strategy::DENSE &amp;&amp; <span class="stringliteral">&quot;Clusterer::cluster: only dense allocation clustering currently supported&quot;</span>);</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> overallStats;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordtype">double</span> fastClusterTime = 0.0;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordtype">double</span> distanceMatrixTime = 0.0;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keywordtype">double</span> dendrogramTraversalTime = 0.0;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keywordtype">double</span> regioningTime = 0.0;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordtype">double</span> evalTime = 0.0;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="comment">// Pair of nodes to their (minimum) distance and the number of occurrences of that distance.</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::pair&lt;NodeID, NodeID&gt;</a>, std::pair&lt;unsigned, unsigned&gt;&gt; distances;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordtype">double</span> clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="comment">// Map points-to sets to occurrences.</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;</a> pointsToSets;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="comment">// Objects each object shares at least a points-to set with.</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Set&lt;NodeID&gt;</a>&gt; coPointeeGraph;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair&lt;NodeID, unsigned&gt; &amp;keyOcc : keys)</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; {</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;pts = pta-&gt;<a class="code" href="classSVF_1_1BVDataPTAImpl.html#ac9897a09cad8a99169f2da2116807b1b">getPts</a>(keyOcc.first);</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldSize = pointsToSets.size();</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; pointsToSets[pts] += keyOcc.second;;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="comment">// Edges in this graph have no weight or uniqueness, so we only need to</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="comment">// do this for each points-to set once.</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keywordflow">if</span> (oldSize != pointsToSets.size())</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; {</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> firstO = !pts.<a class="code" href="classSVF_1_1PointsTo.html#a13746982a11d0cab57e5919d53bfbec8">empty</a>() ? *(pts.<a class="code" href="classSVF_1_1PointsTo.html#ad5b582d2672617806c61e6170d0b5a7e">begin</a>()) : 0;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;NodeID&gt;</a> &amp;firstOsNeighbours = coPointeeGraph[firstO];</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; {</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">if</span> (o != firstO)</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; firstOsNeighbours.insert(o);</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; coPointeeGraph[o].insert(firstO);</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; }</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; }</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; }</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a> = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a2bd3ca30fc9669d9a0327544bdb4557b">NodeIDAllocator::get</a>()-&gt;<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; overallStats[NumObjects] = std::to_string(numObjects);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordtype">size_t</span> numRegions = 0;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; std::vector&lt;unsigned&gt; objectsRegion;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#ab6115b28808af348e1f6a6b58b4cd84f">Options::RegionedClustering</a>)</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; objectsRegion = regionObjects(coPointeeGraph, numObjects, numRegions);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; }</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; {</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="comment">// Just a single big region (0).</span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; objectsRegion.insert(objectsRegion.end(), <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, 0);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; numRegions = 1;</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; }</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="comment">// Set needs to be ordered because getDistanceMatrix, in its n^2 iteration, expects</span></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="comment">// sets to be ordered (we are building a condensed matrix, not a full matrix, so it</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="comment">// matters). In getDistanceMatrix, doing regionReverseMapping for oi and oj, where</span></div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="comment">// oi &lt; oj, and getting a result moi &gt; moj gives incorrect results.</span></div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="comment">// In the condensed matrix, [b][a] where b &gt;= a, is incorrect.</span></div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; std::vector&lt;OrderedSet&lt;NodeID&gt;&gt; regionsObjects(numRegions);</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o = 0; o &lt; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>; ++o) regionsObjects[objectsRegion[o]].insert(o);</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160;</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="comment">// Size of the return node mapping. It is potentially larger than the number of</span></div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="comment">// objects because we align each region to NATIVE_INT_SIZE.</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="comment">// size_t numMappings = 0;</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="comment">// Maps a region to a mapping which maps 0 to n to all objects</span></div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="comment">// in that region.</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; std::vector&lt;std::vector&lt;NodeID&gt;&gt; regionMappings(numRegions);</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="comment">// The reverse: region to mapping of objects to a 0 to n from above.</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; std::vector&lt;Map&lt;NodeID, unsigned&gt;&gt; regionReverseMappings(numRegions);</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="comment">// We can thus use 0 to n for each region to create smaller distance matrices.</span></div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> region = 0; region &lt; numRegions; ++region)</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; {</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordtype">size_t</span> curr = 0;</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="comment">// With the OrderedSet above, o1 &lt; o2 =&gt; map[o1] &lt; map[o2].</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : regionsObjects[region])</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; {</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="comment">// push_back here is just like p...[region][curr] = o.</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; regionMappings[region].push_back(o);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; regionReverseMappings[region][o] = curr++;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; }</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="comment">// curr is the number of objects. A region with no objects makes no sense.</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; assert(curr != 0);</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="comment">// Number of bits needed for this region if we were</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="comment">// to start assigning from 0 rounded up to the fewest needed</span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="comment">// native ints. This is added to the number of mappings since</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="comment">// we align each region to a native int.</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="comment">// numMappings += requiredBits(regionsObjects[region].size());</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; }</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="comment">// Points-to sets which are relevant to a region, i.e., those whose elements</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="comment">// belong to that region. Pair is for occurences.</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; std::vector&lt;std::vector&lt;std::pair&lt;const PointsTo *, unsigned&gt;&gt;&gt; regionsPointsTos(numRegions);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;::value_type</a> &amp;ptocc : pointsToSets)</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; {</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;pt = ptocc.first;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keyword">const</span> <span class="keywordtype">unsigned</span> occ = ptocc.second;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keywordflow">if</span> (pt.<a class="code" href="classSVF_1_1PointsTo.html#a13746982a11d0cab57e5919d53bfbec8">empty</a>()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="comment">// Guaranteed that begin() != end() because of the continue above. All objects in pt</span></div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="comment">// will be relevant to the same region.</span></div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keywordtype">unsigned</span> region = objectsRegion[*(pt.<a class="code" href="classSVF_1_1PointsTo.html#ad5b582d2672617806c61e6170d0b5a7e">begin</a>())];</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <span class="comment">// In our &quot;graph&quot;, objects in the same points-to set have an edge between them,</span></div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="comment">// so they are all in the same connected component/region.</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; regionsPointsTos[region].push_back(std::make_pair(&amp;pt, occ));</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; }</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordtype">double</span> clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; regioningTime = (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; overallStats[RegioningTime] = std::to_string(regioningTime);</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; overallStats[NumRegions] = std::to_string(numRegions);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; std::vector&lt;hclust_fast_methods&gt; methods;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8e0538a7f2e3c5bece69bc69f7074819">Options::ClusterMethod</a> == <a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda66ab3fde95842ef6da0dae1f702a9618">HCLUST_METHOD_SVF_BEST</a>)</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; {</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; methods.push_back(<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913ddad16cc6362447cc32292c4af4c6fe8024">HCLUST_METHOD_SINGLE</a>);</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; methods.push_back(<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda44ce22fdfc560f27242e9b8f8e7009f4">HCLUST_METHOD_COMPLETE</a>);</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; methods.push_back(<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda3ab72664fc61704a1ba46bddbc347115">HCLUST_METHOD_AVERAGE</a>);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; {</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; methods.push_back(<a class="code" href="classSVF_1_1Options.html#a8e0538a7f2e3c5bece69bc69f7074819">Options::ClusterMethod</a>);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; }</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a> method : methods)</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; std::vector&lt;NodeID&gt; nodeMap(numObjects, UINT_MAX);</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160;</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keywordtype">unsigned</span> numGtIntRegions = 0;</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="keywordtype">unsigned</span> largestRegion = 0;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keywordtype">unsigned</span> nonTrivialRegionObjects = 0;</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keywordtype">unsigned</span> allocCounter = 0;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> region = 0; region &lt; numRegions; ++region)</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; {</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> regionNumObjects = regionsObjects[region].size();</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="comment">// Round up to next Word: ceiling of current allocation to get how</span></div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="comment">// many words and multiply to get the number of bits; if we&#39;re aligning.</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a88550ed8c4ec2ccc5d5e40869499787b">Options::RegionAlign</a>)</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; {</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; allocCounter =</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; ((allocCounter + <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a> - 1) / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>) * <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; }</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keywordflow">if</span> (regionNumObjects &gt; largestRegion) largestRegion = regionNumObjects;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="comment">// For regions with fewer than 64 objects, we can just allocate them</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">// however as they will be in the one int regardless..</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">if</span> (regionNumObjects &lt; <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>)</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; {</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : regionsObjects[region]) nodeMap[o] = allocCounter++;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; }</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; ++numGtIntRegions;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; nonTrivialRegionObjects += regionNumObjects;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160;</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="keywordtype">double</span> *distMatrix = getDistanceMatrix(regionsPointsTos[region], regionNumObjects,</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; regionReverseMappings[region], distanceMatrixTime);</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keywordtype">int</span> *dendrogram = <span class="keyword">new</span> <span class="keywordtype">int</span>[2 * (regionNumObjects - 1)];</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="keywordtype">double</span> *height = <span class="keyword">new</span> <span class="keywordtype">double</span>[regionNumObjects - 1];</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <a class="code" href="fastcluster_8h.html#acccd226cbdf0944b5c9e24c84a4599c9">hclust_fast</a>(regionNumObjects, distMatrix, method, dendrogram, height);</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="keyword">delete</span>[] distMatrix;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keyword">delete</span>[] height;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; fastClusterTime += (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160;</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;int&gt;</a> visited;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; traverseDendrogram(nodeMap, dendrogram, regionNumObjects, allocCounter,</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; visited, regionNumObjects - 1, regionMappings[region]);</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keyword">delete</span>[] dendrogram;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; dendrogramTraversalTime += (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; }</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; candidates.push_back(std::make_pair(method, nodeMap));</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="comment">// Though we &quot;update&quot; these in the loop, they will be the same every iteration.</span></div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; overallStats[NumGtIntRegions] = std::to_string(numGtIntRegions);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; overallStats[LargestRegion] = std::to_string(largestRegion);</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; overallStats[NumNonTrivialRegionObjects] = std::to_string(nonTrivialRegionObjects);</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; }</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="comment">// Work out which of the mappings we generated looks best.</span></div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; std::pair&lt;hclust_fast_methods, std::vector&lt;NodeID&gt;&gt; bestMapping = determineBestMapping(candidates, pointsToSets,</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; evalSubtitle, evalTime);</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; overallStats[DistanceMatrixTime] = std::to_string(distanceMatrixTime);</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; overallStats[DendrogramTraversalTime] = std::to_string(dendrogramTraversalTime);</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; overallStats[FastClusterTime] = std::to_string(fastClusterTime);</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; overallStats[EvalTime] = std::to_string(evalTime);</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; overallStats[TotalTime] = std::to_string(distanceMatrixTime + dendrogramTraversalTime + fastClusterTime + regioningTime + evalTime);</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160;</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; overallStats[BestCandidate] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a14a4c5124f2fd03ca3d898e2acd54160">SVFUtil::hclustMethodToString</a>(bestMapping.first);</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; printStats(evalSubtitle + <span class="stringliteral">&quot;: overall&quot;</span>, overallStats);</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keywordflow">return</span> bestMapping.second;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160;}</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160;</div><div class="line"><a name="l00398"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f"> 398</a></span>&#160;std::vector&lt;NodeID&gt; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(<span class="keyword">const</span> std::vector&lt;NodeID&gt; &amp;nodeMapping)</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160;{</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="comment">// nodeMapping.size() may not be big enough because we leave some gaps, but it&#39;s a start.</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; std::vector&lt;NodeID&gt; reverseNodeMapping(nodeMapping.size(), UINT_MAX);</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; nodeMapping.size(); ++i)</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; {</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> mapsTo = nodeMapping.at(i);</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="keywordflow">if</span> (mapsTo &gt;= reverseNodeMapping.size()) reverseNodeMapping.resize(mapsTo + 1, UINT_MAX);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; reverseNodeMapping.at(mapsTo) = i;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; }</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordflow">return</span> reverseNodeMapping;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160;}</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160;</div><div class="line"><a name="l00412"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac8c209af1d177cbc8fbbfe4526fe8ce2"> 412</a></span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac8c209af1d177cbc8fbbfe4526fe8ce2">NodeIDAllocator::Clusterer::condensedIndex</a>(<span class="keywordtype">size_t</span> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>, <span class="keywordtype">size_t</span> i, <span class="keywordtype">size_t</span> j)</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160;{</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="comment">// From https://stackoverflow.com/a/14839010</span></div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keywordflow">return</span> n*(n-1)/2 - (n-i)*(n-i-1)/2 + j - i - 1;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160;}</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160;</div><div class="line"><a name="l00418"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a9aea96839c51ac1e2cbf4813174bb21c"> 418</a></span>&#160;<span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a9aea96839c51ac1e2cbf4813174bb21c">NodeIDAllocator::Clusterer::requiredBits</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;pts)</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;{</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">return</span> requiredBits(pts.<a class="code" href="classSVF_1_1PointsTo.html#aa0d4ee196b91fce626f3f15bcc5599e4">count</a>());</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160;}</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160;</div><div class="line"><a name="l00423"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad0f0a6b61a044db819c253f8b9ab093e"> 423</a></span>&#160;<span class="keywordtype">unsigned</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a9aea96839c51ac1e2cbf4813174bb21c">NodeIDAllocator::Clusterer::requiredBits</a>(<span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>)</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160;{</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">if</span> (n == 0) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="comment">// Ceiling of number of bits amongst each native integer gives needed native ints,</span></div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="comment">// so we then multiply again by the number of bits in each native int.</span></div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordflow">return</span> ((n - 1) / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a> + 1) * <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>;</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160;}</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;</div><div class="line"><a name="l00431"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#adf415d244ef1fafe7a7de3c360553c0f"> 431</a></span>&#160;<span class="keywordtype">double</span> *<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#adf415d244ef1fafe7a7de3c360553c0f">NodeIDAllocator::Clusterer::getDistanceMatrix</a>(<span class="keyword">const</span> std::vector&lt;std::pair&lt;const PointsTo *, unsigned&gt;&gt; pointsToSets,</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, unsigned&gt;</a> &amp;nodeMap,</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordtype">double</span> &amp;distanceMatrixTime)</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;{</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keywordtype">size_t</span> condensedSize = (numObjects * (numObjects - 1)) / 2;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="keywordtype">double</span> *distMatrix = <span class="keyword">new</span> <span class="keywordtype">double</span>[condensedSize];</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; condensedSize; ++i) distMatrix[i] = numObjects * numObjects;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="comment">// TODO: maybe use machine epsilon?</span></div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="comment">// For reducing distance due to extra occurrences.</span></div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="comment">// Can differentiate ~9999 occurrences.</span></div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordtype">double</span> occurrenceEpsilon = 0.0001;</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160;</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair&lt;const PointsTo *, unsigned&gt; &amp;ptsOcc : pointsToSets)</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; {</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> *pts = ptsOcc.first;</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; assert(pts != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keyword">const</span> <span class="keywordtype">unsigned</span> occ = ptsOcc.second;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="comment">// Distance between each element of pts.</span></div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="keywordtype">unsigned</span> distance = requiredBits(*pts) / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>;</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="comment">// Use a vector so we can index into pts.</span></div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; std::vector&lt;NodeID&gt; ptsVec;</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : *pts) ptsVec.push_back(o);</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; ptsVec.size(); ++i)</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; {</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> oi = ptsVec[i];</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, unsigned&gt;::const_iterator</a> moi = nodeMap.find(oi);</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; assert(moi != nodeMap.end());</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = i + 1; j &lt; ptsVec.size(); ++j)</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; {</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> oj = ptsVec[j];</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, unsigned&gt;::const_iterator</a> moj = nodeMap.find(oj);</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; assert(moj != nodeMap.end());</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keywordtype">double</span> &amp;existingDistance = distMatrix[condensedIndex(numObjects, moi-&gt;second, moj-&gt;second)];</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160;</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="comment">// Subtract extra occurrenceEpsilon to make upcoming logic simpler.</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">// When existingDistance is never whole, it is always between two distances.</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">if</span> (distance &lt; existingDistance) existingDistance = distance - occurrenceEpsilon;</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordflow">if</span> (distance == std::ceil(existingDistance))</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; {</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="comment">// We have something like distance == x, existingDistance == x - e, for some e &lt; 1</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="comment">// (potentially even set during this iteration).</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="comment">// So, the new distance is an occurrence the existingDistance being tracked, it just</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <span class="comment">// had some reductions because of multiple occurences.</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="comment">// If there is not room within this distance to reduce more (increase priority),</span></div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="comment">// just ignore it. TODO: maybe warn?</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="keywordflow">if</span> (existingDistance - occ * occurrenceEpsilon &gt; std::floor(existingDistance))</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; {</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; existingDistance -= occ * occurrenceEpsilon;</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; }</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="comment">// Reached minimum.</span></div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; existingDistance = std::floor(existingDistance) + occurrenceEpsilon;</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; }</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; }</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; }</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160;</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; }</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160;</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; distanceMatrixTime += (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordflow">return</span> distMatrix;</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160;}</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;</div><div class="line"><a name="l00502"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#abd44e3b07b0482bacf6b1a080fe650c6"> 502</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#abd44e3b07b0482bacf6b1a080fe650c6">NodeIDAllocator::Clusterer::traverseDendrogram</a>(std::vector&lt;NodeID&gt; &amp;nodeMap, <span class="keyword">const</span> <span class="keywordtype">int</span> *dendrogram, <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, <span class="keywordtype">unsigned</span> &amp;allocCounter, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;int&gt;</a> &amp;visited, <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, <span class="keyword">const</span> std::vector&lt;NodeID&gt; &amp;regionNodeMap)</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160;{</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keywordflow">if</span> (visited.find(index) != visited.end()) <span class="keywordflow">return</span>;</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; visited.insert(index);</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160;</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="keywordtype">int</span> left = dendrogram[index - 1];</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keywordflow">if</span> (left &lt; 0)</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; {</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="comment">// Reached a leaf.</span></div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="comment">// -1 because the items start from 1 per fastcluster (TODO).</span></div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; nodeMap[regionNodeMap[std::abs(left) - 1]] = allocCounter;</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; ++allocCounter;</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; }</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; {</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; traverseDendrogram(nodeMap, dendrogram, numObjects, allocCounter, visited, left, regionNodeMap);</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; }</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160;</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="comment">// Repeat for the right child.</span></div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keywordtype">int</span> right = dendrogram[(numObjects - 1) + index - 1];</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keywordflow">if</span> (right &lt; 0)</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; {</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; nodeMap[regionNodeMap[std::abs(right) - 1]] = allocCounter;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; ++allocCounter;</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; }</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; {</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; traverseDendrogram(nodeMap, dendrogram, numObjects, allocCounter, visited, right, regionNodeMap);</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;}</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160;</div><div class="line"><a name="l00533"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a7d34542f34a8e8008119c3d61943daa2"> 533</a></span>&#160;std::vector&lt;NodeID&gt; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a7d34542f34a8e8008119c3d61943daa2">NodeIDAllocator::Clusterer::regionObjects</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a>, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;NodeID&gt;</a>&gt; &amp;graph, <span class="keywordtype">size_t</span> <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, <span class="keywordtype">size_t</span> &amp;numLabels)</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;{</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="keywordtype">unsigned</span> label = UINT_MAX;</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; std::vector&lt;NodeID&gt; labels(numObjects, UINT_MAX);</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;NodeID&gt;</a> labelled;</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a>, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;NodeID&gt;</a>&gt;::value_type &amp;oos : graph)</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; {</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o = oos.first;</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="keywordflow">if</span> (labels[o] != UINT_MAX) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; std::queue&lt;NodeID&gt; bfsQueue;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; bfsQueue.push(o);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; ++label;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="keywordflow">while</span> (!bfsQueue.empty())</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; {</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o = bfsQueue.front();</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; bfsQueue.pop();</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">if</span> (labels[o] != UINT_MAX)</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; {</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; assert(labels[o] == label);</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; }</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; labels[o] = label;</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Set&lt;NodeID&gt;</a>&gt;::const_iterator neighboursIt = graph.find(o);</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; assert(neighboursIt != graph.end());</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> neighbour : neighboursIt-&gt;second) bfsQueue.push(neighbour);</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; }</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; }</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="comment">// The remaining objects have no relation with others: they get their own label.</span></div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> o = 0; o &lt; <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>; ++o)</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; {</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="keywordflow">if</span> (labels[o] == UINT_MAX) labels[o] = ++label;</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; }</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160;</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; numLabels = label + 1;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keywordflow">return</span> labels;</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160;}</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160;</div><div class="line"><a name="l00573"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba"> 573</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba">NodeIDAllocator::Clusterer::evaluate</a>(<span class="keyword">const</span> std::vector&lt;NodeID&gt; &amp;nodeMap, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;</a> pointsToSets, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> &amp;stats, <span class="keywordtype">bool</span> accountForOcc)</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160;{</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalTheoretical = 0;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalOriginalSbv = 0;</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalOriginalBv = 0;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalNewSbv = 0;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalNewBv = 0;</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160;</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;::value_type</a> &amp;ptsOcc : pointsToSets)</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; {</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;pts = ptsOcc.first;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keyword">const</span> <span class="keywordtype">unsigned</span> occ = ptsOcc.second;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keywordflow">if</span> (pts.<a class="code" href="classSVF_1_1PointsTo.html#aa0d4ee196b91fce626f3f15bcc5599e4">count</a>() == 0) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160;</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> theoretical = requiredBits(pts) / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="keywordflow">if</span> (accountForOcc) theoretical *= occ;</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="comment">// Check number of words for original SBV.</span></div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;unsigned&gt;</a> words;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <span class="comment">// TODO: nasty hardcoding.</span></div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts) words.insert(o / 128);</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> originalSbv = words.size() * 2;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="keywordflow">if</span> (accountForOcc) originalSbv *= occ;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="comment">// Check number of words for original BV.</span></div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> min = UINT_MAX;</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> max = 0;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; {</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; <span class="keywordflow">if</span> (o &lt; min) min = o;</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <span class="keywordflow">if</span> (o &gt; max) max = o;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; }</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; words.clear();</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> = min; <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> &lt;= max; ++<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; {</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; words.insert(<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>);</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; }</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> originalBv = words.size();</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="keywordflow">if</span> (accountForOcc) originalBv *= occ;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <span class="comment">// Check number of words for new SBV.</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; words.clear();</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <span class="comment">// TODO: nasty hardcoding.</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts) words.insert(nodeMap[o] / 128);</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> newSbv = words.size() * 2;</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; <span class="keywordflow">if</span> (accountForOcc) newSbv *= occ;</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160;</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; <span class="comment">// Check number of words for new BV.</span></div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; min = UINT_MAX;</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; max = 0;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; {</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> mappedO = nodeMap[o];</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keywordflow">if</span> (mappedO &lt; min) min = mappedO;</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="keywordflow">if</span> (mappedO &gt; max) max = mappedO;</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; }</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; words.clear();</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="comment">// No nodeMap[b] because min and max and from nodeMap.</span></div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> = min; <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> &lt;= max; ++<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>) words.insert(<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a> / <a class="code" href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> newBv = words.size();</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keywordflow">if</span> (accountForOcc) newBv *= occ;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160;</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; totalTheoretical += theoretical;</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; totalOriginalSbv += originalSbv;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; totalOriginalBv += originalBv;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; totalNewSbv += newSbv;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; totalNewBv += newBv;</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; }</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160;</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; stats[TheoreticalNumWords] = std::to_string(totalTheoretical);</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; stats[OriginalSbvNumWords] = std::to_string(totalOriginalSbv);</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; stats[OriginalBvNumWords] = std::to_string(totalOriginalBv);</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; stats[NewSbvNumWords] = std::to_string(totalNewSbv);</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; stats[NewBvNumWords] = std::to_string(totalNewBv);</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160;}</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160;<span class="comment">// Work out which of the mappings we generated looks best.</span></div><div class="line"><a name="l00651"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3f86e733cc075180e9682887c554b8fa"> 651</a></span>&#160;std::pair&lt;hclust_fast_methods, std::vector&lt;NodeID&gt;&gt; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3f86e733cc075180e9682887c554b8fa">NodeIDAllocator::Clusterer::determineBestMapping</a>(</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="keyword">const</span> std::vector&lt;std::pair&lt;<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a>, std::vector&lt;NodeID&gt;&gt;&gt; &amp;candidates,</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;PointsTo, unsigned&gt;</a> pointsToSets, <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;evalSubtitle, <span class="keywordtype">double</span> &amp;evalTime)</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160;{</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; <span class="comment">// In case we&#39;re not comparing anything, set to first &quot;candidate&quot;.</span></div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; std::pair&lt;hclust_fast_methods, std::vector&lt;NodeID&gt;&gt; bestMapping = candidates[0];</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <span class="comment">// Number of bits required for the best candidate.</span></div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="keywordtype">size_t</span> bestWords = std::numeric_limits&lt;size_t&gt;::max();</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="keywordflow">if</span> (evalSubtitle != <span class="stringliteral">&quot;&quot;</span> || <a class="code" href="classSVF_1_1Options.html#a8e0538a7f2e3c5bece69bc69f7074819">Options::ClusterMethod</a> == <a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda66ab3fde95842ef6da0dae1f702a9618">HCLUST_METHOD_SVF_BEST</a>)</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; {</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair&lt;<a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a>, std::vector&lt;NodeID&gt;&gt; &amp;candidate : candidates)</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; {</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> candidateStats;</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <a class="code" href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a> candidateMethod = candidate.first;</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> candidateMethodName = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a14a4c5124f2fd03ca3d898e2acd54160">SVFUtil::hclustMethodToString</a>(candidateMethod);</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; std::vector&lt;NodeID&gt; candidateMapping = candidate.second;</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160;</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <span class="comment">// TODO: parameterise final arg.</span></div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> clkStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; evaluate(candidateMapping, pointsToSets, candidateStats, <span class="keyword">true</span>);</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; <span class="keyword">const</span> <span class="keywordtype">double</span> clkEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; evalTime += (clkEnd - clkStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; printStats(evalSubtitle + <span class="stringliteral">&quot;: candidate &quot;</span> + candidateMethodName, candidateStats);</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160;</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; <span class="keywordtype">size_t</span> candidateWords = 0;</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#abc02c7dc5e6cb3613856e0f774c6d304">Options::PtType</a> == <a class="code" href="classSVF_1_1PointsTo.html#a8f757f92ebf0a2ebdb5e6b001606923eacccb6e19f3e8db5f5b5b8858b22da61a">PointsTo::SBV</a>) candidateWords = std::stoull(candidateStats[NewSbvNumWords]);</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#abc02c7dc5e6cb3613856e0f774c6d304">Options::PtType</a> == <a class="code" href="classSVF_1_1PointsTo.html#a8f757f92ebf0a2ebdb5e6b001606923ea0397c2678894d1792fcd3432a7aa64fb">PointsTo::CBV</a>) candidateWords = std::stoull(candidateStats[NewBvNumWords]);</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <span class="keywordflow">else</span> assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;Clusterer::cluster: unsupported BV type for clustering.&quot;</span>);</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160;</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <span class="keywordflow">if</span> (candidateWords &lt; bestWords)</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; {</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; bestWords = candidateWords;</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; bestMapping = candidate;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; }</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; }</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; }</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <span class="keywordflow">return</span> bestMapping;</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160;}</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160;</div><div class="line"><a name="l00691"></a><span class="lineno"><a class="line" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7"> 691</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">NodeIDAllocator::Clusterer::printStats</a>(<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> subtitle, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> &amp;stats)</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160;{</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="comment">// When not in order, it is too hard to compare original/new SBV/BV words, so this array forces an order.</span></div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="keyword">const</span> <span class="keyword">static</span> std::array&lt;std::string, 17&gt; statKeys =</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; {</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; NumObjects, TheoreticalNumWords, OriginalSbvNumWords, OriginalBvNumWords,</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; NewSbvNumWords, NewBvNumWords, NumRegions, NumGtIntRegions,</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; NumNonTrivialRegionObjects, LargestRegion, RegioningTime,</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; DistanceMatrixTime, FastClusterTime, DendrogramTraversalTime,</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; EvalTime, TotalTime, BestCandidate</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; };</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160;</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <span class="keyword">const</span> <span class="keywordtype">unsigned</span> fieldWidth = 20;</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flags(std::ios::left);</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;****Clusterer Statistics: &quot;</span> &lt;&lt; subtitle &lt;&lt; <span class="stringliteral">&quot;****\n&quot;</span>;</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;statKey : statKeys)</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; {</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;::const_iterator</a> stat = stats.find(statKey);</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; <span class="keywordflow">if</span> (stat != stats.end())</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; {</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; std::setw(fieldWidth) &lt;&lt; statKey &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; stat-&gt;second &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; }</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; }</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160;</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flush();</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160;}</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160;</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160;}; <span class="comment">// namespace SVF.</span></div><div class="ttc" id="classSVF_1_1BVDataPTAImpl_html"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html">SVF::BVDataPTAImpl</a></div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00042">PointerAnalysisImpl.h:42</a></div></div>
70
70
  <div class="ttc" id="classSVF_1_1PointsTo_html_a8f757f92ebf0a2ebdb5e6b001606923eacccb6e19f3e8db5f5b5b8858b22da61a"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a8f757f92ebf0a2ebdb5e6b001606923eacccb6e19f3e8db5f5b5b8858b22da61a">SVF::PointsTo::SBV</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00033">PointsTo.h:33</a></div></div>
71
71
  <div class="ttc" id="cJSON_8h_html_a750b5d744c39a06bfb13e6eb010e35d0"><div class="ttname"><a href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a></div><div class="ttdeci">int index</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00170">cJSON.h:170</a></div></div>
72
+ <div class="ttc" id="classSVF_1_1PointsTo_html_a13746982a11d0cab57e5919d53bfbec8"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a13746982a11d0cab57e5919d53bfbec8">SVF::PointsTo::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdoc">Returns true if set is empty. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00098">PointsTo.cpp:98</a></div></div>
72
73
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_ad7cb36a1f0f67864fb8290e9dfd7b639"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad7cb36a1f0f67864fb8290e9dfd7b639">SVF::NodeIDAllocator::Clusterer::NumGtIntRegions</a></div><div class="ttdeci">static const std::string NumGtIntRegions</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00130">NodeIDAllocator.h:130</a></div></div>
73
74
  <div class="ttc" id="namespaceSVF_html_a350ae9bf8606bdfe23c8679681b969dc"><div class="ttname"><a href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="include_2MTA_2MTAResultValidator_8h_source.html#l00020">MTAResultValidator.h:20</a></div></div>
74
75
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html">SVF::NodeIDAllocator</a></div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00020">NodeIDAllocator.h:20</a></div></div>
@@ -81,7 +82,7 @@ $(function() {
81
82
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a67e85749e539ea34146b197668a4ea64"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a67e85749e539ea34146b197668a4ea64">SVF::NodeIDAllocator::allocator</a></div><div class="ttdeci">static NodeIDAllocator * allocator</div><div class="ttdoc">Single allocator. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00103">NodeIDAllocator.h:103</a></div></div>
82
83
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a779446e2fe92518401f1732fb809f066"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a779446e2fe92518401f1732fb809f066">SVF::NodeIDAllocator::Clusterer::NewSbvNumWords</a></div><div class="ttdeci">static const std::string NewSbvNumWords</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00128">NodeIDAllocator.h:128</a></div></div>
83
84
  <div class="ttc" id="classSVF_1_1Options_html_a2537be131132830c63d408133619a065"><div class="ttname"><a href="classSVF_1_1Options.html#a2537be131132830c63d408133619a065">SVF::Options::NodeAllocStrat</a></div><div class="ttdeci">static const llvm::cl::opt&lt; SVF::NodeIDAllocator::Strategy &gt; NodeAllocStrat</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00035">Options.h:35</a></div></div>
84
- <div class="ttc" id="SVFType_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00446">SVFType.h:446</a></div></div>
85
+ <div class="ttc" id="SVFType_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00444">SVFType.h:444</a></div></div>
85
86
  <div class="ttc" id="SVFUtil_8h_html"><div class="ttname"><a href="SVFUtil_8h.html">SVFUtil.h</a></div></div>
86
87
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_afa74c5ccd22bebe0b76db33066d8b498"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afa74c5ccd22bebe0b76db33066d8b498">SVF::NodeIDAllocator::Clusterer::NumObjects</a></div><div class="ttdeci">static const std::string NumObjects</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00117">NodeIDAllocator.h:117</a></div></div>
87
88
  <div class="ttc" id="SVFType_8h_html"><div class="ttname"><a href="SVFType_8h.html">SVFType.h</a></div></div>
@@ -101,19 +102,15 @@ $(function() {
101
102
  <div class="ttc" id="NodeIDAllocator_8h_html"><div class="ttname"><a href="NodeIDAllocator_8h.html">NodeIDAllocator.h</a></div></div>
102
103
  <div class="ttc" id="classSVF_1_1Options_html_a88550ed8c4ec2ccc5d5e40869499787b"><div class="ttname"><a href="classSVF_1_1Options.html#a88550ed8c4ec2ccc5d5e40869499787b">SVF::Options::RegionAlign</a></div><div class="ttdeci">static const llvm::cl::opt&lt; bool &gt; RegionAlign</div><div class="ttdoc">Align identifiers in each region to a word. </div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00062">Options.h:62</a></div></div>
103
104
  <div class="ttc" id="fastcluster_8h_html_a4205a14ad66b3320d2e94c61d74913dda44ce22fdfc560f27242e9b8f8e7009f4"><div class="ttname"><a href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda44ce22fdfc560f27242e9b8f8e7009f4">HCLUST_METHOD_COMPLETE</a></div><div class="ttdef"><b>Definition:</b> <a href="fastcluster_8h_source.html#l00070">fastcluster.h:70</a></div></div>
104
- <div class="ttc" id="classSVF_1_1PointsTo_html_aa53962e561399bf493d1f2b9137356f6"><div class="ttname"><a href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">SVF::PointsTo::begin</a></div><div class="ttdeci">const_iterator begin(void) const</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00128">PointsTo.h:128</a></div></div>
105
105
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a3f86e733cc075180e9682887c554b8fa"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3f86e733cc075180e9682887c554b8fa">SVF::NodeIDAllocator::Clusterer::determineBestMapping</a></div><div class="ttdeci">static std::pair&lt; hclust_fast_methods, std::vector&lt; NodeID &gt; &gt; determineBestMapping(const std::vector&lt; std::pair&lt; hclust_fast_methods, std::vector&lt; NodeID &gt;&gt;&gt; &amp;candidates, Map&lt; PointsTo, unsigned &gt; pointsToSets, const std::string &amp;evalSubtitle, double &amp;evalTime)</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00651">NodeIDAllocator.cpp:651</a></div></div>
106
106
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a7d34542f34a8e8008119c3d61943daa2"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a7d34542f34a8e8008119c3d61943daa2">SVF::NodeIDAllocator::Clusterer::regionObjects</a></div><div class="ttdeci">static std::vector&lt; unsigned &gt; regionObjects(const Map&lt; NodeID, Set&lt; NodeID &gt;&gt; &amp;graph, size_t numObjects, size_t &amp;numLabels)</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00533">NodeIDAllocator.cpp:533</a></div></div>
107
107
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a33d502a0bd49307cd824e34b73157b9b"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">SVF::NodeIDAllocator::Clusterer::cluster</a></div><div class="ttdeci">static std::vector&lt; NodeID &gt; cluster(BVDataPTAImpl *pta, const std::vector&lt; std::pair&lt; NodeID, unsigned &gt;&gt; keys, std::vector&lt; std::pair&lt; hclust_fast_methods, std::vector&lt; NodeID &gt;&gt;&gt; &amp;candidates, std::string evalSubtitle=&quot;&quot;)</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00188">NodeIDAllocator.cpp:188</a></div></div>
108
108
  <div class="ttc" id="fastcluster_8h_html_a4205a14ad66b3320d2e94c61d74913dda66ab3fde95842ef6da0dae1f702a9618"><div class="ttname"><a href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dda66ab3fde95842ef6da0dae1f702a9618">HCLUST_METHOD_SVF_BEST</a></div><div class="ttdef"><b>Definition:</b> <a href="fastcluster_8h_source.html#l00076">fastcluster.h:76</a></div></div>
109
109
  <div class="ttc" id="namespaceSVF_html_af739db846e47ba6b2fd15eaad31ab7fb"><div class="ttname"><a href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">SVF::Set</a></div><div class="ttdeci">std::unordered_set&lt; Key, Hash, KeyEqual, Allocator &gt; Set</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00094">SVFType.h:94</a></div></div>
110
110
  <div class="ttc" id="fastcluster_8h_html_a4205a14ad66b3320d2e94c61d74913dd"><div class="ttname"><a href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913dd">hclust_fast_methods</a></div><div class="ttdeci">hclust_fast_methods</div><div class="ttdef"><b>Definition:</b> <a href="fastcluster_8h_source.html#l00065">fastcluster.h:65</a></div></div>
111
- <div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_aee289e298e421448caaa604b7eb34fcb"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">SVF::BVDataPTAImpl::getPts</a></div><div class="ttdeci">virtual const PointsTo &amp; getPts(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00099">PointerAnalysisImpl.h:99</a></div></div>
112
- <div class="ttc" id="classSVF_1_1PointsTo_html_a879783ba6629e500af9aa7dfcda2563d"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a879783ba6629e500af9aa7dfcda2563d">SVF::PointsTo::count</a></div><div class="ttdeci">u32_t count(void) const</div><div class="ttdoc">Returns number of elements. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00107">PointsTo.cpp:107</a></div></div>
113
111
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a639b887e30115c2a6cd108c65f18fcc1"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a639b887e30115c2a6cd108c65f18fcc1">SVF::NodeIDAllocator::Clusterer::OriginalSbvNumWords</a></div><div class="ttdeci">static const std::string OriginalSbvNumWords</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00126">NodeIDAllocator.h:126</a></div></div>
114
112
  <div class="ttc" id="classSVF_1_1Options_html_a8e0538a7f2e3c5bece69bc69f7074819"><div class="ttname"><a href="classSVF_1_1Options.html#a8e0538a7f2e3c5bece69bc69f7074819">SVF::Options::ClusterMethod</a></div><div class="ttdeci">static const llvm::cl::opt&lt; enum hclust_fast_methods &gt; ClusterMethod</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00056">Options.h:56</a></div></div>
115
113
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a001c25f6998b8b0a9a7e5e00810e155f"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a001c25f6998b8b0a9a7e5e00810e155f">SVF::NodeIDAllocator::numValues</a></div><div class="ttdeci">NodeID numValues</div><div class="ttdoc">Number of values allocated, including specials. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00092">NodeIDAllocator.h:92</a></div></div>
116
- <div class="ttc" id="classSVF_1_1PointsTo_html_ac4688413177b49b37dbbfd3ed188d59b"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">SVF::PointsTo::empty</a></div><div class="ttdeci">bool empty(void) const</div><div class="ttdoc">Returns true if set is empty. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00094">PointsTo.cpp:94</a></div></div>
117
114
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a14a4c5124f2fd03ca3d898e2acd54160"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a14a4c5124f2fd03ca3d898e2acd54160">SVF::SVFUtil::hclustMethodToString</a></div><div class="ttdeci">std::string hclustMethodToString(hclust_fast_methods method)</div><div class="ttdoc">Returns a string representation of a hclust method. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00259">SVFUtil.cpp:259</a></div></div>
118
115
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a3556bdda6725b72d0ca88364daeae32e"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3556bdda6725b72d0ca88364daeae32e">SVF::NodeIDAllocator::Clusterer::BestCandidate</a></div><div class="ttdeci">static const std::string BestCandidate</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00132">NodeIDAllocator.h:132</a></div></div>
119
116
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aed0b0b9f035057552a6a82154fd88e61"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVF::SVFUtil::outs</a></div><div class="ttdeci">std::ostream &amp; outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
@@ -121,7 +118,7 @@ $(function() {
121
118
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a6a300a5b455fe4b8bace2f1d66fb5f9d"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a6a300a5b455fe4b8bace2f1d66fb5f9d">SVF::NodeIDAllocator::constantObjectId</a></div><div class="ttdeci">static const NodeID constantObjectId</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00048">NodeIDAllocator.h:48</a></div></div>
122
119
  <div class="ttc" id="fastcluster_8h_html_a4205a14ad66b3320d2e94c61d74913ddad16cc6362447cc32292c4af4c6fe8024"><div class="ttname"><a href="fastcluster_8h.html#a4205a14ad66b3320d2e94c61d74913ddad16cc6362447cc32292c4af4c6fe8024">HCLUST_METHOD_SINGLE</a></div><div class="ttdef"><b>Definition:</b> <a href="fastcluster_8h_source.html#l00068">fastcluster.h:68</a></div></div>
123
120
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_af7952ef5667039c9be86a589419b35a8"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#af7952ef5667039c9be86a589419b35a8">SVF::NodeIDAllocator::unset</a></div><div class="ttdeci">static void unset(void)</div><div class="ttdoc">Deletes the (singleton) allocator. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00035">NodeIDAllocator.cpp:35</a></div></div>
124
- <div class="ttc" id="SVFType_8h_html_ab8ca0fd9d0caa6817d305cae0f1cf022"><div class="ttname"><a href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a></div><div class="ttdeci">#define NATIVE_INT_SIZE</div><div class="ttdoc">Size of native integer that we&amp;#39;ll use for bit vectors, in bits. </div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00450">SVFType.h:450</a></div></div>
121
+ <div class="ttc" id="SVFType_8h_html_ab8ca0fd9d0caa6817d305cae0f1cf022"><div class="ttname"><a href="SVFType_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a></div><div class="ttdeci">#define NATIVE_INT_SIZE</div><div class="ttdoc">Size of native integer that we&amp;#39;ll use for bit vectors, in bits. </div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00448">SVFType.h:448</a></div></div>
125
122
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a79ee84d7efb8abbfcd80d31d966ce20b"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a79ee84d7efb8abbfcd80d31d966ce20b">SVF::NodeIDAllocator::blackHoleObjectId</a></div><div class="ttdeci">static const NodeID blackHoleObjectId</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00047">NodeIDAllocator.h:47</a></div></div>
126
123
  <div class="ttc" id="classSVF_1_1PointsTo_html_a8f757f92ebf0a2ebdb5e6b001606923ea0397c2678894d1792fcd3432a7aa64fb"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a8f757f92ebf0a2ebdb5e6b001606923ea0397c2678894d1792fcd3432a7aa64fb">SVF::PointsTo::CBV</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00034">PointsTo.h:34</a></div></div>
127
124
  <div class="ttc" id="classSVF_1_1Options_html"><div class="ttname"><a href="classSVF_1_1Options.html">SVF::Options</a></div><div class="ttdoc">Carries around command line options. </div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00019">Options.h:19</a></div></div>
@@ -140,11 +137,14 @@ $(function() {
140
137
  <div class="ttc" id="fastcluster_8h_html"><div class="ttname"><a href="fastcluster_8h.html">fastcluster.h</a></div></div>
141
138
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_afef85f0ecacd681357b3945f97d52964"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afef85f0ecacd681357b3945f97d52964">SVF::NodeIDAllocator::Clusterer::TotalTime</a></div><div class="ttdeci">static const std::string TotalTime</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00123">NodeIDAllocator.h:123</a></div></div>
142
139
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a535be344f97496d8086e2861ea6dc2ea"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a535be344f97496d8086e2861ea6dc2ea">SVF::NodeIDAllocator::blackHolePointerId</a></div><div class="ttdeci">static const NodeID blackHolePointerId</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00049">NodeIDAllocator.h:49</a></div></div>
140
+ <div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_ac9897a09cad8a99169f2da2116807b1b"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#ac9897a09cad8a99169f2da2116807b1b">SVF::BVDataPTAImpl::getPts</a></div><div class="ttdeci">const PointsTo &amp; getPts(NodeID id) override</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00088">PointerAnalysisImpl.h:88</a></div></div>
143
141
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a44420802f9db288515ee09771c3edd4d"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a44420802f9db288515ee09771c3edd4d">SVF::NodeIDAllocator::strategy</a></div><div class="ttdeci">enum Strategy strategy</div><div class="ttdoc">Strategy to allocate with. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00100">NodeIDAllocator.h:100</a></div></div>
144
142
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a1d98862e19affdd08740f85490d0d856"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1d98862e19affdd08740f85490d0d856">SVF::NodeIDAllocator::Clusterer::EvalTime</a></div><div class="ttdeci">static const std::string EvalTime</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00122">NodeIDAllocator.h:122</a></div></div>
145
143
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a1bf9461c717e8dabaee6a57f3d76d61f"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1bf9461c717e8dabaee6a57f3d76d61f">SVF::NodeIDAllocator::Clusterer::NumNonTrivialRegionObjects</a></div><div class="ttdeci">static const std::string NumNonTrivialRegionObjects</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00133">NodeIDAllocator.h:133</a></div></div>
146
144
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a3a160f4c6e761a130b863a3df0af7f96"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a3a160f4c6e761a130b863a3df0af7f96">SVF::NodeIDAllocator::numSymbols</a></div><div class="ttdeci">NodeID numSymbols</div><div class="ttdoc">Number of explicit symbols allocated (e.g., llvm::Values), including specials. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00094">NodeIDAllocator.h:94</a></div></div>
147
145
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_ac8c209af1d177cbc8fbbfe4526fe8ce2"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac8c209af1d177cbc8fbbfe4526fe8ce2">SVF::NodeIDAllocator::Clusterer::condensedIndex</a></div><div class="ttdeci">static size_t condensedIndex(size_t n, size_t i, size_t j)</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00412">NodeIDAllocator.cpp:412</a></div></div>
146
+ <div class="ttc" id="classSVF_1_1PointsTo_html_aa0d4ee196b91fce626f3f15bcc5599e4"><div class="ttname"><a href="classSVF_1_1PointsTo.html#aa0d4ee196b91fce626f3f15bcc5599e4">SVF::PointsTo::count</a></div><div class="ttdeci">u32_t count() const</div><div class="ttdoc">Returns number of elements. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00111">PointsTo.cpp:111</a></div></div>
147
+ <div class="ttc" id="classSVF_1_1PointsTo_html_ad5b582d2672617806c61e6170d0b5a7e"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ad5b582d2672617806c61e6170d0b5a7e">SVF::PointsTo::begin</a></div><div class="ttdeci">const_iterator begin() const</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00128">PointsTo.h:128</a></div></div>
148
148
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a26b5e09e10448694435f74a8b622a7e8"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a26b5e09e10448694435f74a8b622a7e8">SVF::NodeIDAllocator::allocateValueId</a></div><div class="ttdeci">NodeID allocateValueId(void)</div><div class="ttdoc">Allocate a value ID as determined by the strategy. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00129">NodeIDAllocator.cpp:129</a></div></div>
149
149
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_ac8d6abc4ee27ae464f3978e4f4bdc3a6"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#ac8d6abc4ee27ae464f3978e4f4bdc3a6">SVF::NodeIDAllocator::NodeIDAllocator</a></div><div class="ttdeci">NodeIDAllocator(void)</div><div class="ttdoc">Builds a node ID allocator with the strategy specified on the command line. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00045">NodeIDAllocator.cpp:45</a></div></div>
150
150
  <div class="ttc" id="classSVF_1_1PointsTo_html"><div class="ttname"><a href="classSVF_1_1PointsTo.html">SVF::PointsTo</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00028">PointsTo.h:28</a></div></div>