svf-tools 1.0.557 → 1.0.558

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 (189) hide show
  1. package/SVF-doxygen/html/html/AndersenPWC_8h_source.html +15 -15
  2. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +12 -11
  3. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +11 -10
  4. package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +47 -46
  5. package/SVF-doxygen/html/html/AndersenWaveDiff_8cpp_source.html +9 -8
  6. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +35 -34
  7. package/SVF-doxygen/html/html/Andersen_8h_source.html +6 -6
  8. package/SVF-doxygen/html/html/CHGBuilder_8cpp.html +2 -2
  9. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +19 -18
  10. package/SVF-doxygen/html/html/CHGBuilder_8h_source.html +15 -15
  11. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +4 -4
  12. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +13 -12
  13. package/SVF-doxygen/html/html/DDAPass_8h_source.html +11 -11
  14. package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +20 -19
  15. package/SVF-doxygen/html/html/DDAStat_8h_source.html +13 -13
  16. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +2 -2
  17. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +3 -3
  18. package/SVF-doxygen/html/html/ICFGStat_8h_source.html +5 -4
  19. package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +2 -2
  20. package/SVF-doxygen/html/html/MHP_8cpp_source.html +2 -2
  21. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +5 -5
  22. package/SVF-doxygen/html/html/MTAStat_8h_source.html +1 -1
  23. package/SVF-doxygen/html/html/MTA_8cpp_source.html +2 -2
  24. package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +2 -2
  25. package/SVF-doxygen/html/html/NodeIDAllocator_8cpp_source.html +2 -2
  26. package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +67 -69
  27. package/SVF-doxygen/html/html/PTAStat_8h.html +1 -0
  28. package/SVF-doxygen/html/html/PTAStat_8h_source.html +70 -76
  29. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +2 -2
  30. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +1 -1
  31. package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +2 -1
  32. package/SVF-doxygen/html/html/SVFGReadWrite_8cpp_source.html +5 -4
  33. package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +22 -21
  34. package/SVF-doxygen/html/html/SVFGStat_8h_source.html +5 -5
  35. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +5 -5
  36. package/SVF-doxygen/html/html/SVFG_8h_source.html +3 -3
  37. package/SVF-doxygen/html/html/SVFStat_8cpp.html +81 -0
  38. package/SVF-doxygen/html/html/SVFStat_8cpp_source.html +85 -0
  39. package/SVF-doxygen/html/html/SVFStat_8h.html +94 -0
  40. package/SVF-doxygen/html/html/SVFStat_8h_source.html +103 -0
  41. package/SVF-doxygen/html/html/Steensgaard_8h_source.html +1 -1
  42. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +2 -2
  43. package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +3 -3
  44. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +2 -2
  45. package/SVF-doxygen/html/html/WPAStat_8h_source.html +8 -8
  46. package/SVF-doxygen/html/html/annotated.html +39 -38
  47. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +79 -79
  48. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +15 -15
  49. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +37 -37
  50. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +1 -1
  51. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +22 -22
  52. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat-members.html +24 -22
  53. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +97 -86
  54. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.png +0 -0
  55. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +24 -24
  56. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +47 -47
  57. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +4 -4
  58. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +30 -30
  59. package/SVF-doxygen/html/html/classSVF_1_1DDAStat-members.html +24 -23
  60. package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +80 -67
  61. package/SVF-doxygen/html/html/classSVF_1_1DDAStat.png +0 -0
  62. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +4 -4
  63. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +4 -4
  64. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +26 -26
  65. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat-members.html +24 -22
  66. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +67 -56
  67. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.png +0 -0
  68. package/SVF-doxygen/html/html/classSVF_1_1ICFGStat-members.html +23 -21
  69. package/SVF-doxygen/html/html/classSVF_1_1ICFGStat.html +55 -42
  70. package/SVF-doxygen/html/html/classSVF_1_1ICFGStat.png +0 -0
  71. package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +6 -6
  72. package/SVF-doxygen/html/html/classSVF_1_1MHP.html +4 -4
  73. package/SVF-doxygen/html/html/classSVF_1_1MTA.html +2 -2
  74. package/SVF-doxygen/html/html/classSVF_1_1MTAStat-members.html +25 -23
  75. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +59 -48
  76. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.png +0 -0
  77. package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +5 -5
  78. package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat-members.html +22 -21
  79. package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat.html +57 -44
  80. package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat.png +0 -0
  81. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer.html +6 -6
  82. package/SVF-doxygen/html/html/classSVF_1_1Options.html +2 -2
  83. package/SVF-doxygen/html/html/classSVF_1_1PTAStat-members.html +24 -22
  84. package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +186 -420
  85. package/SVF-doxygen/html/html/classSVF_1_1PTAStat.png +0 -0
  86. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +2 -2
  87. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +12 -12
  88. package/SVF-doxygen/html/html/classSVF_1_1SVFGStat-members.html +33 -32
  89. package/SVF-doxygen/html/html/classSVF_1_1SVFGStat.html +100 -87
  90. package/SVF-doxygen/html/html/classSVF_1_1SVFGStat.png +0 -0
  91. package/SVF-doxygen/html/html/classSVF_1_1SVFStat-members.html +100 -0
  92. package/SVF-doxygen/html/html/classSVF_1_1SVFStat.html +605 -0
  93. package/SVF-doxygen/html/html/classSVF_1_1SVFStat.png +0 -0
  94. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +1 -1
  95. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +4 -4
  96. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +12 -12
  97. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat-members.html +26 -24
  98. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +65 -54
  99. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.png +0 -0
  100. package/SVF-doxygen/html/html/classes.html +50 -50
  101. package/SVF-doxygen/html/html/dda_8cpp.html +1 -1
  102. package/SVF-doxygen/html/html/dda_8cpp_source.html +1 -1
  103. package/SVF-doxygen/html/html/dir_862d3276083eaac55caed79b9120bf29.html +2 -0
  104. package/SVF-doxygen/html/html/dir_95e22971b5dbae2382075a3453e365b4.html +2 -0
  105. package/SVF-doxygen/html/html/files.html +10 -8
  106. package/SVF-doxygen/html/html/functions_0x7e.html +3 -0
  107. package/SVF-doxygen/html/html/functions_c.html +28 -29
  108. package/SVF-doxygen/html/html/functions_e.html +3 -2
  109. package/SVF-doxygen/html/html/functions_enum.html +1 -1
  110. package/SVF-doxygen/html/html/functions_eval_c.html +1 -1
  111. package/SVF-doxygen/html/html/functions_eval_w.html +1 -1
  112. package/SVF-doxygen/html/html/functions_f.html +3 -3
  113. package/SVF-doxygen/html/html/functions_func_0x7e.html +3 -0
  114. package/SVF-doxygen/html/html/functions_func_c.html +28 -27
  115. package/SVF-doxygen/html/html/functions_func_e.html +1 -1
  116. package/SVF-doxygen/html/html/functions_func_g.html +1 -1
  117. package/SVF-doxygen/html/html/functions_func_p.html +9 -7
  118. package/SVF-doxygen/html/html/functions_func_s.html +14 -11
  119. package/SVF-doxygen/html/html/functions_g.html +2 -2
  120. package/SVF-doxygen/html/html/functions_l.html +6 -6
  121. package/SVF-doxygen/html/html/functions_m.html +2 -1
  122. package/SVF-doxygen/html/html/functions_n.html +1 -1
  123. package/SVF-doxygen/html/html/functions_o.html +3 -3
  124. package/SVF-doxygen/html/html/functions_p.html +25 -21
  125. package/SVF-doxygen/html/html/functions_r.html +7 -3
  126. package/SVF-doxygen/html/html/functions_s.html +24 -22
  127. package/SVF-doxygen/html/html/functions_t.html +8 -8
  128. package/SVF-doxygen/html/html/functions_type_n.html +1 -1
  129. package/SVF-doxygen/html/html/functions_type_s.html +1 -1
  130. package/SVF-doxygen/html/html/functions_type_t.html +1 -1
  131. package/SVF-doxygen/html/html/functions_vars_e.html +1 -0
  132. package/SVF-doxygen/html/html/functions_vars_g.html +1 -1
  133. package/SVF-doxygen/html/html/functions_vars_m.html +1 -0
  134. package/SVF-doxygen/html/html/functions_vars_s.html +1 -0
  135. package/SVF-doxygen/html/html/functions_vars_t.html +1 -1
  136. package/SVF-doxygen/html/html/functions_w.html +12 -12
  137. package/SVF-doxygen/html/html/hierarchy.html +47 -46
  138. package/SVF-doxygen/html/html/namespaceSVF.html +2 -0
  139. package/SVF-doxygen/html/html/search/all_10.js +13 -13
  140. package/SVF-doxygen/html/html/search/all_11.js +3 -3
  141. package/SVF-doxygen/html/html/search/all_12.js +11 -8
  142. package/SVF-doxygen/html/html/search/all_13.js +4 -4
  143. package/SVF-doxygen/html/html/search/all_15.js +1 -1
  144. package/SVF-doxygen/html/html/search/all_16.js +3 -3
  145. package/SVF-doxygen/html/html/search/all_19.js +1 -0
  146. package/SVF-doxygen/html/html/search/all_3.js +3 -3
  147. package/SVF-doxygen/html/html/search/all_5.js +2 -2
  148. package/SVF-doxygen/html/html/search/all_6.js +1 -1
  149. package/SVF-doxygen/html/html/search/all_7.js +2 -2
  150. package/SVF-doxygen/html/html/search/all_c.js +3 -3
  151. package/SVF-doxygen/html/html/search/all_d.js +1 -1
  152. package/SVF-doxygen/html/html/search/all_e.js +2 -2
  153. package/SVF-doxygen/html/html/search/all_f.js +2 -2
  154. package/SVF-doxygen/html/html/search/classes_f.js +1 -0
  155. package/SVF-doxygen/html/html/search/enums_1.js +1 -1
  156. package/SVF-doxygen/html/html/search/enumvalues_13.js +1 -1
  157. package/SVF-doxygen/html/html/search/enumvalues_2.js +1 -1
  158. package/SVF-doxygen/html/html/search/files_d.js +2 -0
  159. package/SVF-doxygen/html/html/search/functions_11.js +2 -1
  160. package/SVF-doxygen/html/html/search/functions_17.js +1 -0
  161. package/SVF-doxygen/html/html/search/functions_2.js +1 -1
  162. package/SVF-doxygen/html/html/search/functions_4.js +1 -1
  163. package/SVF-doxygen/html/html/search/functions_6.js +1 -1
  164. package/SVF-doxygen/html/html/search/functions_f.js +4 -4
  165. package/SVF-doxygen/html/html/search/typedefs_10.js +1 -1
  166. package/SVF-doxygen/html/html/search/typedefs_11.js +1 -1
  167. package/SVF-doxygen/html/html/search/typedefs_c.js +1 -1
  168. package/SVF-doxygen/html/html/search/variables_12.js +1 -1
  169. package/SVF-doxygen/html/html/search/variables_13.js +3 -3
  170. package/SVF-doxygen/html/html/search/variables_5.js +1 -1
  171. package/SVF-doxygen/html/html/search/variables_7.js +1 -1
  172. package/SVF-doxygen/html/html/search/variables_d.js +1 -1
  173. package/include/Graphs/ICFGStat.h +1 -1
  174. package/include/Util/PTAStat.h +6 -36
  175. package/include/Util/SVFStat.h +95 -0
  176. package/include/WPA/AndersenPWC.h +1 -1
  177. package/lib/DDA/DDAPass.cpp +1 -0
  178. package/lib/DDA/DDAStat.cpp +1 -0
  179. package/lib/Graphs/SVFGReadWrite.cpp +1 -0
  180. package/lib/Graphs/SVFGStat.cpp +1 -0
  181. package/lib/SVF-FE/CHGBuilder.cpp +1 -0
  182. package/lib/Util/PTAStat.cpp +2 -21
  183. package/lib/Util/SVFStat.cpp +58 -0
  184. package/lib/WPA/Andersen.cpp +1 -0
  185. package/lib/WPA/AndersenSCD.cpp +1 -0
  186. package/lib/WPA/AndersenSFR.cpp +1 -0
  187. package/lib/WPA/AndersenStat.cpp +1 -0
  188. package/lib/WPA/AndersenWaveDiff.cpp +1 -0
  189. package/package.json +1 -1
@@ -227,7 +227,7 @@ Static Private Attributes</h2></td></tr>
227
227
  <p>Returns vector mapping previously allocated node IDs to a smarter allocation based on the points-to sets in pta accessed through keys. The second part of the keys pairs are the number of (potential) occurrences of that points-to set or a subset, depending on the client's wish. TODO: interfaces are getting unwieldy, an initialised object may be better. TODO: kind of sucks pta can't be const here because getPts isn't. </p>
228
228
 
229
229
  <p class="definition">Definition at line <a class="el" href="NodeIDAllocator_8cpp_source.html#l00188">188</a> of file <a class="el" href="NodeIDAllocator_8cpp_source.html">NodeIDAllocator.cpp</a>.</p>
230
- <div class="fragment"><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; Map&lt;std::string, std::string&gt; 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; Map&lt;std::pair&lt;NodeID, NodeID&gt;, 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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">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; Map&lt;PointsTo, unsigned&gt; 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; Map&lt;NodeID, Set&lt;NodeID&gt;&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> PointsTo &amp;pts = pta-&gt;getPts(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#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> firstO = !pts.empty() ? *(pts.begin()) : 0;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; Set&lt;NodeID&gt; &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#a43a65e0d33af3c743294f7a1139d2301">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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afa74c5ccd22bebe0b76db33066d8b498">NumObjects</a>] = 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 = <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a7d34542f34a8e8008119c3d61943daa2">regionObjects</a>(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#a43a65e0d33af3c743294f7a1139d2301">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#a43a65e0d33af3c743294f7a1139d2301">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> Map&lt;PointsTo, unsigned&gt;::value_type &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> PointsTo &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.empty()) <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.begin())];</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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">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="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad5f733cad8a103a64e80270acb67567a">RegioningTime</a>] = std::to_string(regioningTime);</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac5fe44f10cdbca9754444943a0f5c3c1">NumRegions</a>] = 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="SVFBasicTypes_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a> - 1) / <a class="code" href="SVFBasicTypes_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>) * <a class="code" href="SVFBasicTypes_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="SVFBasicTypes_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#a43a65e0d33af3c743294f7a1139d2301">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 = <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#adf415d244ef1fafe7a7de3c360553c0f">getDistanceMatrix</a>(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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">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="SVFBasicTypes_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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; Set&lt;int&gt; visited;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#abd44e3b07b0482bacf6b1a080fe650c6">traverseDendrogram</a>(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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">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="SVFBasicTypes_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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad7cb36a1f0f67864fb8290e9dfd7b639">NumGtIntRegions</a>] = std::to_string(numGtIntRegions);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a172d72ae4ae45fa2baf2f20ff2b499dc">LargestRegion</a>] = std::to_string(largestRegion);</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1bf9461c717e8dabaee6a57f3d76d61f">NumNonTrivialRegionObjects</a>] = 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 = <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3f86e733cc075180e9682887c554b8fa">determineBestMapping</a>(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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a09d2dbb2faab0a0e03bfa353534116a8">DistanceMatrixTime</a>] = std::to_string(distanceMatrixTime);</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a67ab9cffacc1584b2e7bae5d1b08c541">DendrogramTraversalTime</a>] = std::to_string(dendrogramTraversalTime);</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ae78d2b60035350c634f6f58d7a043c22">FastClusterTime</a>] = std::to_string(fastClusterTime);</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1d98862e19affdd08740f85490d0d856">EvalTime</a>] = std::to_string(evalTime);</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afef85f0ecacd681357b3945f97d52964">TotalTime</a>] = 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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3556bdda6725b72d0ca88364daeae32e">BestCandidate</a>] = <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; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">printStats</a>(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="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>
230
+ <div class="fragment"><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; Map&lt;std::string, std::string&gt; 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; Map&lt;std::pair&lt;NodeID, NodeID&gt;, 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; Map&lt;PointsTo, unsigned&gt; 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; Map&lt;NodeID, Set&lt;NodeID&gt;&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> PointsTo &amp;pts = pta-&gt;getPts(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#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> firstO = !pts.empty() ? *(pts.begin()) : 0;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; Set&lt;NodeID&gt; &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#a43a65e0d33af3c743294f7a1139d2301">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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afa74c5ccd22bebe0b76db33066d8b498">NumObjects</a>] = 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 = <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a7d34542f34a8e8008119c3d61943daa2">regionObjects</a>(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#a43a65e0d33af3c743294f7a1139d2301">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#a43a65e0d33af3c743294f7a1139d2301">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> Map&lt;PointsTo, unsigned&gt;::value_type &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> PointsTo &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.empty()) <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.begin())];</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="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad5f733cad8a103a64e80270acb67567a">RegioningTime</a>] = std::to_string(regioningTime);</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac5fe44f10cdbca9754444943a0f5c3c1">NumRegions</a>] = 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="SVFBasicTypes_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a> - 1) / <a class="code" href="SVFBasicTypes_8h.html#ab8ca0fd9d0caa6817d305cae0f1cf022">NATIVE_INT_SIZE</a>) * <a class="code" href="SVFBasicTypes_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="SVFBasicTypes_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#a43a65e0d33af3c743294f7a1139d2301">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 = <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#adf415d244ef1fafe7a7de3c360553c0f">getDistanceMatrix</a>(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="SVFBasicTypes_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; Set&lt;int&gt; visited;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#abd44e3b07b0482bacf6b1a080fe650c6">traverseDendrogram</a>(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="SVFBasicTypes_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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ad7cb36a1f0f67864fb8290e9dfd7b639">NumGtIntRegions</a>] = std::to_string(numGtIntRegions);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a172d72ae4ae45fa2baf2f20ff2b499dc">LargestRegion</a>] = std::to_string(largestRegion);</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1bf9461c717e8dabaee6a57f3d76d61f">NumNonTrivialRegionObjects</a>] = 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 = <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3f86e733cc075180e9682887c554b8fa">determineBestMapping</a>(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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a09d2dbb2faab0a0e03bfa353534116a8">DistanceMatrixTime</a>] = std::to_string(distanceMatrixTime);</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a67ab9cffacc1584b2e7bae5d1b08c541">DendrogramTraversalTime</a>] = std::to_string(dendrogramTraversalTime);</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ae78d2b60035350c634f6f58d7a043c22">FastClusterTime</a>] = std::to_string(fastClusterTime);</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a1d98862e19affdd08740f85490d0d856">EvalTime</a>] = std::to_string(evalTime);</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; overallStats[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#afef85f0ecacd681357b3945f97d52964">TotalTime</a>] = 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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a3556bdda6725b72d0ca88364daeae32e">BestCandidate</a>] = <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; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">printStats</a>(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="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>
231
231
  <div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
232
232
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a67ab9cffacc1584b2e7bae5d1b08c541"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a67ab9cffacc1584b2e7bae5d1b08c541">SVF::NodeIDAllocator::Clusterer::DendrogramTraversalTime</a></div><div class="ttdeci">static const std::string DendrogramTraversalTime</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00121">NodeIDAllocator.h:121</a></div></div>
233
233
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a190c729a3f3f622f82cee4917946b50f"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">SVF::NodeIDAllocator::numObjects</a></div><div class="ttdeci">NodeID numObjects</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00090">NodeIDAllocator.h:90</a></div></div>
@@ -246,6 +246,7 @@ Static Private Attributes</h2></td></tr>
246
246
  <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#l00055">Options.h:55</a></div></div>
247
247
  <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#l00367">SVFUtil.cpp:367</a></div></div>
248
248
  <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>
249
+ <div class="ttc" id="classSVF_1_1SVFStat_html_ac9d390c417df6f6af6b274618b87010d"><div class="ttname"><a href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVF::SVFStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="SVFStat_8cpp_source.html#l00041">SVFStat.cpp:41</a></div></div>
249
250
  <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>
250
251
  <div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00182">SVFBasicTypes.h:182</a></div></div>
251
252
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a172d72ae4ae45fa2baf2f20ff2b499dc"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a172d72ae4ae45fa2baf2f20ff2b499dc">SVF::NodeIDAllocator::Clusterer::LargestRegion</a></div><div class="ttdeci">static const std::string LargestRegion</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00131">NodeIDAllocator.h:131</a></div></div>
@@ -260,7 +261,6 @@ Static Private Attributes</h2></td></tr>
260
261
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_ac5fe44f10cdbca9754444943a0f5c3c1"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac5fe44f10cdbca9754444943a0f5c3c1">SVF::NodeIDAllocator::Clusterer::NumRegions</a></div><div class="ttdeci">static const std::string NumRegions</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00129">NodeIDAllocator.h:129</a></div></div>
261
262
  <div class="ttc" id="SVFBasicTypes_8h_html_ab8ca0fd9d0caa6817d305cae0f1cf022"><div class="ttname"><a href="SVFBasicTypes_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="SVFBasicTypes_8h_source.html#l00186">SVFBasicTypes.h:186</a></div></div>
262
263
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_abd44e3b07b0482bacf6b1a080fe650c6"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#abd44e3b07b0482bacf6b1a080fe650c6">SVF::NodeIDAllocator::Clusterer::traverseDendrogram</a></div><div class="ttdeci">static void traverseDendrogram(std::vector&lt; NodeID &gt; &amp;nodeMap, const int *dendrogram, const size_t numObjects, unsigned &amp;allocCounter, Set&lt; int &gt; &amp;visited, const int index, const std::vector&lt; NodeID &gt; &amp;regionNodeMap)</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00502">NodeIDAllocator.cpp:502</a></div></div>
263
- <div class="ttc" id="classSVF_1_1PTAStat_html_a3c4eaa1695ea13405911ae1621f98edc"><div class="ttname"><a href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">SVF::PTAStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="PTAStat_8cpp_source.html#l00114">PTAStat.cpp:114</a></div></div>
264
264
  </div><!-- fragment -->
265
265
  </div>
266
266
  </div>
@@ -357,7 +357,7 @@ Static Private Attributes</h2></td></tr>
357
357
  </div><div class="memdoc">
358
358
 
359
359
  <p class="definition">Definition at line <a class="el" href="NodeIDAllocator_8cpp_source.html#l00651">651</a> of file <a class="el" href="NodeIDAllocator_8cpp_source.html">NodeIDAllocator.cpp</a>.</p>
360
- <div class="fragment"><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; Map&lt;std::string, std::string&gt; 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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba">evaluate</a>(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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">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="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">printStats</a>(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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a779446e2fe92518401f1732fb809f066">NewSbvNumWords</a>]);</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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#af3fe4b4098898ee38928c9db30ea0fe9">NewBvNumWords</a>]);</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="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>
360
+ <div class="fragment"><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; Map&lt;std::string, std::string&gt; 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; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba">evaluate</a>(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="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">printStats</a>(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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a779446e2fe92518401f1732fb809f066">NewSbvNumWords</a>]);</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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#af3fe4b4098898ee38928c9db30ea0fe9">NewBvNumWords</a>]);</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="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>
361
361
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_acbbc5c04c79846fe1cc46a3bd5a65aba"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba">SVF::NodeIDAllocator::Clusterer::evaluate</a></div><div class="ttdeci">static void evaluate(const std::vector&lt; NodeID &gt; &amp;nodeMap, const Map&lt; PointsTo, unsigned &gt; pointsToSets, Map&lt; std::string, std::string &gt; &amp;stats, bool accountForOcc)</div><div class="ttdoc">Fills in *NumWords statistics in stats.. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00573">NodeIDAllocator.cpp:573</a></div></div>
362
362
  <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>
363
363
  <div class="ttc" id="classSVF_1_1Options_html_abc02c7dc5e6cb3613856e0f774c6d304"><div class="ttname"><a href="classSVF_1_1Options.html#abc02c7dc5e6cb3613856e0f774c6d304">SVF::Options::PtType</a></div><div class="ttdeci">static const llvm::cl::opt&lt; PointsTo::Type &gt; PtType</div><div class="ttdoc">Type of points-to set to use for all analyses. </div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00049">Options.h:49</a></div></div>
@@ -366,11 +366,11 @@ Static Private Attributes</h2></td></tr>
366
366
  <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>
367
367
  <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#l00055">Options.h:55</a></div></div>
368
368
  <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#l00367">SVFUtil.cpp:367</a></div></div>
369
+ <div class="ttc" id="classSVF_1_1SVFStat_html_ac9d390c417df6f6af6b274618b87010d"><div class="ttname"><a href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVF::SVFStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="SVFStat_8cpp_source.html#l00041">SVFStat.cpp:41</a></div></div>
369
370
  <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>
370
371
  <div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00182">SVFBasicTypes.h:182</a></div></div>
371
372
  <div class="ttc" id="cJSON_8h_html_ad4c68ea99a26b0a98ad9a79982960458"><div class="ttname"><a href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">string</a></div><div class="ttdeci">const char *const string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00172">cJSON.h:172</a></div></div>
372
373
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_af3fe4b4098898ee38928c9db30ea0fe9"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#af3fe4b4098898ee38928c9db30ea0fe9">SVF::NodeIDAllocator::Clusterer::NewBvNumWords</a></div><div class="ttdeci">static const std::string NewBvNumWords</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00127">NodeIDAllocator.h:127</a></div></div>
373
- <div class="ttc" id="classSVF_1_1PTAStat_html_a3c4eaa1695ea13405911ae1621f98edc"><div class="ttname"><a href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">SVF::PTAStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="PTAStat_8cpp_source.html#l00114">PTAStat.cpp:114</a></div></div>
374
374
  </div><!-- fragment -->
375
375
  </div>
376
376
  </div>
@@ -484,13 +484,13 @@ Static Private Attributes</h2></td></tr>
484
484
  <p>Builds the upper triangle of the distance matrix, as an array of length (numObjects * (numObjects - 1)) / 2, as required by fastcluster. Responsibility of caller to <code>delete</code>. </p>
485
485
 
486
486
  <p class="definition">Definition at line <a class="el" href="NodeIDAllocator_8cpp_source.html#l00431">431</a> of file <a class="el" href="NodeIDAllocator_8cpp_source.html">NodeIDAllocator.cpp</a>.</p>
487
- <div class="fragment"><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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">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 = (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a> * (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a> - 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] = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a> * <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</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> PointsTo *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 = <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a9aea96839c51ac1e2cbf4813174bb21c">requiredBits</a>(*pts) / <a class="code" href="SVFBasicTypes_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#a43a65e0d33af3c743294f7a1139d2301">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#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> oi = ptsVec[i];</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keyword">const</span> Map&lt;NodeID, unsigned&gt;::const_iterator 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#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> oj = ptsVec[j];</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keyword">const</span> Map&lt;NodeID, unsigned&gt;::const_iterator 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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac8c209af1d177cbc8fbbfe4526fe8ce2">condensedIndex</a>(<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, 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_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">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="SVFBasicTypes_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="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
487
+ <div class="fragment"><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 = (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a> * (<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a> - 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] = <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a> * <a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>;</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> PointsTo *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 = <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a9aea96839c51ac1e2cbf4813174bb21c">requiredBits</a>(*pts) / <a class="code" href="SVFBasicTypes_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#a43a65e0d33af3c743294f7a1139d2301">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#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> oi = ptsVec[i];</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keyword">const</span> Map&lt;NodeID, unsigned&gt;::const_iterator 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#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> oj = ptsVec[j];</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keyword">const</span> Map&lt;NodeID, unsigned&gt;::const_iterator 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[<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac8c209af1d177cbc8fbbfe4526fe8ce2">condensedIndex</a>(<a class="code" href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">numObjects</a>, 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="SVFBasicTypes_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="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
488
488
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a9aea96839c51ac1e2cbf4813174bb21c"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a9aea96839c51ac1e2cbf4813174bb21c">SVF::NodeIDAllocator::Clusterer::requiredBits</a></div><div class="ttdeci">static unsigned requiredBits(const PointsTo &amp;pts)</div><div class="ttdoc">Returns the minimum number of bits required to represent pts in a perfect world. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00418">NodeIDAllocator.cpp:418</a></div></div>
489
489
  <div class="ttc" id="classSVF_1_1NodeIDAllocator_html_a190c729a3f3f622f82cee4917946b50f"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator.html#a190c729a3f3f622f82cee4917946b50f">SVF::NodeIDAllocator::numObjects</a></div><div class="ttdeci">NodeID numObjects</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8h_source.html#l00090">NodeIDAllocator.h:90</a></div></div>
490
+ <div class="ttc" id="classSVF_1_1SVFStat_html_ac9d390c417df6f6af6b274618b87010d"><div class="ttname"><a href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVF::SVFStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="SVFStat_8cpp_source.html#l00041">SVFStat.cpp:41</a></div></div>
490
491
  <div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00182">SVFBasicTypes.h:182</a></div></div>
491
492
  <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>
492
493
  <div class="ttc" id="SVFBasicTypes_8h_html_ab8ca0fd9d0caa6817d305cae0f1cf022"><div class="ttname"><a href="SVFBasicTypes_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="SVFBasicTypes_8h_source.html#l00186">SVFBasicTypes.h:186</a></div></div>
493
- <div class="ttc" id="classSVF_1_1PTAStat_html_a3c4eaa1695ea13405911ae1621f98edc"><div class="ttname"><a href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">SVF::PTAStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="PTAStat_8cpp_source.html#l00114">PTAStat.cpp:114</a></div></div>
494
494
  </div><!-- fragment -->
495
495
  </div>
496
496
  </div>
@@ -83,7 +83,7 @@ Public Member Functions</h2></td></tr>
83
83
  </table><table class="memberdecls">
84
84
  <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
85
85
  Static Public Attributes</h2></td></tr>
86
- <tr class="memitem:a6a62b34de8ec23899a8024e0450c43df"><td class="memItemLeft" align="right" valign="top">static const llvm::cl::opt&lt; enum <a class="el" href="classSVF_1_1PTAStat.html#a926cd5ab95f4f42ffe264413a32725cf">PTAStat::ClockType</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSVF_1_1Options.html#a6a62b34de8ec23899a8024e0450c43df">ClockType</a></td></tr>
86
+ <tr class="memitem:a6a62b34de8ec23899a8024e0450c43df"><td class="memItemLeft" align="right" valign="top">static const llvm::cl::opt&lt; enum <a class="el" href="classSVF_1_1SVFStat.html#a4f47da512cfa8f94fddaddc65334b454">PTAStat::ClockType</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSVF_1_1Options.html#a6a62b34de8ec23899a8024e0450c43df">ClockType</a></td></tr>
87
87
  <tr class="separator:a6a62b34de8ec23899a8024e0450c43df"><td class="memSeparator" colspan="2">&#160;</td></tr>
88
88
  <tr class="memitem:a5cfcf1ddc44ff175c4766f88bf204c03"><td class="memItemLeft" align="right" valign="top">static const llvm::cl::opt&lt; bool &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSVF_1_1Options.html#a5cfcf1ddc44ff175c4766f88bf204c03">MarkedClocksOnly</a></td></tr>
89
89
  <tr class="separator:a5cfcf1ddc44ff175c4766f88bf204c03"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -620,7 +620,7 @@ Static Public Attributes</h2></td></tr>
620
620
  <td class="mlabels-left">
621
621
  <table class="memname">
622
622
  <tr>
623
- <td class="memname">const llvm::cl::opt&lt; enum <a class="el" href="classSVF_1_1PTAStat.html#a926cd5ab95f4f42ffe264413a32725cf">PTAStat::ClockType</a> &gt; SVF::Options::ClockType</td>
623
+ <td class="memname">const llvm::cl::opt&lt; enum <a class="el" href="classSVF_1_1SVFStat.html#a4f47da512cfa8f94fddaddc65334b454">PTAStat::ClockType</a> &gt; SVF::Options::ClockType</td>
624
624
  </tr>
625
625
  </table>
626
626
  </td>