|
273 | 273 | <div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> }</div> |
274 | 274 | <div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> </div> |
275 | 275 | <div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> Index_ ncenters = std::ceil(std::pow(my_obs, options.power));</div> |
276 | | -<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> my_centers.resize(sanisizer::product<I<<span class="keyword">decltype</span>(my_centers.size())> >(ncenters, my_dim));</div> |
| 276 | +<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> my_centers.resize(sanisizer::product<I<<span class="keyword">decltype</span>(my_centers.size())> >(sanisizer::attest_gez(ncenters), my_dim));</div> |
277 | 277 | <div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> </div> |
278 | 278 | <div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <a class="code hl_classRef" href="https://ltla.github.io/CppKmeans/classkmeans_1_1SimpleMatrix.html">kmeans::SimpleMatrix<Index_, Data_></a> mat(my_dim, my_obs, my_data.data());</div> |
279 | | -<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="keyword">auto</span> clusters = sanisizer::create<std::vector<Index_> >(my_obs);</div> |
| 279 | +<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="keyword">auto</span> clusters = sanisizer::create<std::vector<Index_> >(sanisizer::attest_gez(my_obs));</div> |
280 | 280 | <div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="keyword">auto</span> output = <a class="code hl_functionRef" href="https://ltla.github.io/CppKmeans/namespacekmeans.html#a46d49b7746f7d2e0b6f50ec799e0010d">kmeans::compute</a>(mat, *init, *refine, ncenters, my_centers.data(), clusters.data());</div> |
281 | 281 | <div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> </div> |
282 | 282 | <div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="comment">// Removing empty clusters, e.g., due to duplicate points.</span></div> |
283 | 283 | <div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> {</div> |
284 | | -<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> sanisizer::resize(my_sizes, ncenters);</div> |
285 | | -<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keyword">auto</span> remap = sanisizer::create<std::vector<Index_> >(ncenters);</div> |
| 284 | +<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> sanisizer::resize(my_sizes, sanisizer::attest_gez(ncenters));</div> |
| 285 | +<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keyword">auto</span> remap = sanisizer::create<std::vector<Index_> >(sanisizer::attest_gez(ncenters));</div> |
286 | 286 | <div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> Index_ survivors = 0;</div> |
287 | 287 | <div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordflow">for</span> (Index_ c = 0; c < ncenters; ++c) {</div> |
288 | 288 | <div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <span class="keywordflow">if</span> (output.sizes[c]) {</div> |
|
307 | 307 | <div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> }</div> |
308 | 308 | <div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> }</div> |
309 | 309 | <div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> </div> |
310 | | -<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> sanisizer::resize(my_offsets, ncenters);</div> |
| 310 | +<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> sanisizer::resize(my_offsets, sanisizer::attest_gez(ncenters));</div> |
311 | 311 | <div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <span class="keywordflow">for</span> (Index_ i = 1; i < ncenters; ++i) {</div> |
312 | 312 | <div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> my_offsets[i] = my_offsets[i - 1] + my_sizes[i - 1];</div> |
313 | 313 | <div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> }</div> |
314 | 314 | <div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> </div> |
315 | 315 | <div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <span class="comment">// Organize points correctly; firstly, sorting by distance from the assigned center.</span></div> |
316 | | -<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="keyword">auto</span> by_distance = sanisizer::create<std::vector<std::pair<Distance_, Index_> > >(my_obs);</div> |
| 316 | +<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="keyword">auto</span> by_distance = sanisizer::create<std::vector<std::pair<Distance_, Index_> > >(sanisizer::attest_gez(my_obs));</div> |
317 | 317 | <div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> {</div> |
318 | 318 | <div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> <span class="keyword">auto</span> sofar = my_offsets;</div> |
319 | 319 | <div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="keyword">auto</span> host = my_data.data();</div> |
|
339 | 339 | <div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="comment">// Permuting in-place to mirror the reordered distances, so that the search is more cache-friendly.</span></div> |
340 | 340 | <div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> {</div> |
341 | 341 | <div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <span class="keyword">auto</span> host = my_data.data();</div> |
342 | | -<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="keyword">auto</span> used = sanisizer::create<std::vector<unsigned char> >(my_obs);</div> |
| 342 | +<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="keyword">auto</span> used = sanisizer::create<std::vector<unsigned char> >(sanisizer::attest_gez(my_obs));</div> |
343 | 343 | <div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="keyword">auto</span> buffer = sanisizer::create<std::vector<Data_> >(my_dim);</div> |
344 | | -<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> sanisizer::resize(my_observation_id, my_obs);</div> |
345 | | -<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> sanisizer::resize(my_dist_to_centroid, my_obs);</div> |
346 | | -<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> sanisizer::resize(my_new_location, my_obs);</div> |
| 344 | +<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> sanisizer::resize(my_observation_id, sanisizer::attest_gez(my_obs));</div> |
| 345 | +<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> sanisizer::resize(my_dist_to_centroid, sanisizer::attest_gez(my_obs));</div> |
| 346 | +<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> sanisizer::resize(my_new_location, sanisizer::attest_gez(my_obs));</div> |
347 | 347 | <div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> </div> |
348 | 348 | <div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="keywordflow">for</span> (Index_ o = 0; o < my_obs; ++o) {</div> |
349 | 349 | <div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keywordflow">if</span> (used[o]) {</div> |
|
565 | 565 | <div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> <span class="keyword">auto</span> num_centers = my_sizes.size();</div> |
566 | 566 | <div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> <a class="code hl_functionRef" href="https://knncolle.github.io/knncolle/namespaceknncolle.html#ac5079c0b39b7f9e10bd97341ccfad46c">knncolle::quick_load</a>(prefix + <span class="stringliteral">"num_centers"</span>, &num_centers, 1);</div> |
567 | 567 | <div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> </div> |
568 | | -<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> my_data.resize(sanisizer::product<I<<span class="keyword">decltype</span>(my_data.size())> >(my_obs, my_dim));</div> |
| 568 | +<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> my_data.resize(sanisizer::product<I<<span class="keyword">decltype</span>(my_data.size())> >(sanisizer::attest_gez(my_obs), my_dim));</div> |
569 | 569 | <div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <a class="code hl_functionRef" href="https://knncolle.github.io/knncolle/namespaceknncolle.html#ac5079c0b39b7f9e10bd97341ccfad46c">knncolle::quick_load</a>(prefix + <span class="stringliteral">"data"</span>, my_data.data(), my_data.size());</div> |
570 | 570 | <div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> </div> |
571 | | -<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> sanisizer::resize(my_sizes, num_centers);</div> |
| 571 | +<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> sanisizer::resize(my_sizes, sanisizer::attest_gez(num_centers));</div> |
572 | 572 | <div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> <a class="code hl_functionRef" href="https://knncolle.github.io/knncolle/namespaceknncolle.html#ac5079c0b39b7f9e10bd97341ccfad46c">knncolle::quick_load</a>(prefix + <span class="stringliteral">"sizes"</span>, my_sizes.data(), my_sizes.size());</div> |
573 | | -<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> sanisizer::resize(my_offsets, num_centers);</div> |
| 573 | +<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> sanisizer::resize(my_offsets, sanisizer::attest_gez(num_centers));</div> |
574 | 574 | <div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <a class="code hl_functionRef" href="https://knncolle.github.io/knncolle/namespaceknncolle.html#ac5079c0b39b7f9e10bd97341ccfad46c">knncolle::quick_load</a>(prefix + <span class="stringliteral">"offsets"</span>, my_offsets.data(), my_offsets.size());</div> |
575 | | -<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> my_centers.resize(sanisizer::product<I<<span class="keyword">decltype</span>(my_centers.size())> >(my_dim, num_centers));</div> |
| 575 | +<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> my_centers.resize(sanisizer::product<I<<span class="keyword">decltype</span>(my_centers.size())> >(my_dim, sanisizer::attest_gez(num_centers)));</div> |
576 | 576 | <div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> <a class="code hl_functionRef" href="https://knncolle.github.io/knncolle/namespaceknncolle.html#ac5079c0b39b7f9e10bd97341ccfad46c">knncolle::quick_load</a>(prefix + <span class="stringliteral">"centers"</span>, my_centers.data(), my_centers.size());</div> |
577 | 577 | <div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> </div> |
578 | | -<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> sanisizer::resize(my_observation_id, my_obs);</div> |
| 578 | +<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> sanisizer::resize(my_observation_id, sanisizer::attest_gez(my_obs));</div> |
579 | 579 | <div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> <a class="code hl_functionRef" href="https://knncolle.github.io/knncolle/namespaceknncolle.html#ac5079c0b39b7f9e10bd97341ccfad46c">knncolle::quick_load</a>(prefix + <span class="stringliteral">"observation_id"</span>, my_observation_id.data(), my_observation_id.size());</div> |
580 | | -<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> sanisizer::resize(my_new_location, my_obs);</div> |
| 580 | +<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> sanisizer::resize(my_new_location, sanisizer::attest_gez(my_obs));</div> |
581 | 581 | <div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> <a class="code hl_functionRef" href="https://knncolle.github.io/knncolle/namespaceknncolle.html#ac5079c0b39b7f9e10bd97341ccfad46c">knncolle::quick_load</a>(prefix + <span class="stringliteral">"new_location"</span>, my_new_location.data(), my_new_location.size());</div> |
582 | | -<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> sanisizer::resize(my_dist_to_centroid, my_obs);</div> |
| 582 | +<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> sanisizer::resize(my_dist_to_centroid, sanisizer::attest_gez(my_obs));</div> |
583 | 583 | <div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> <a class="code hl_functionRef" href="https://knncolle.github.io/knncolle/namespaceknncolle.html#ac5079c0b39b7f9e10bd97341ccfad46c">knncolle::quick_load</a>(prefix + <span class="stringliteral">"dist_to_centroid"</span>, my_dist_to_centroid.data(), my_dist_to_centroid.size());</div> |
584 | 584 | <div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> </div> |
585 | 585 | <div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <span class="keyword">auto</span> dptr = <a class="code hl_functionRef" href="https://knncolle.github.io/knncolle/namespaceknncolle.html#a5c0df62bd7206b0b3892aedadb2a962c">knncolle::load_distance_metric_raw<Data_, Distance_></a>(prefix + <span class="stringliteral">"distance_"</span>);</div> |
|
0 commit comments