|
166 | 166 | <div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span><span class="keyword">template</span><<span class="keyword">typename</span> W, <span class="keyword">typename</span> A></div> |
167 | 167 | <div class="foldopen" id="foldopen00076" data-start="{" data-end="}"> |
168 | 168 | <div class="line"><a id="l00076" name="l00076"></a><span class="lineno"><a class="line" href="classdatasketches_1_1count__min__sketch.html#a5356c92bb629951dcb748e51677a3886"> 76</a></span><span class="keywordtype">double</span> <a class="code hl_function" href="classdatasketches_1_1count__min__sketch.html#a5356c92bb629951dcb748e51677a3886">count_min_sketch<W,A>::get_relative_error</a>()<span class="keyword"> const </span>{</div> |
169 | | -<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordflow">return</span> exp(1.0) / double(_num_buckets);</div> |
| 169 | +<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordflow">return</span> exp(1.0) / <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(_num_buckets);</div> |
170 | 170 | <div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span>}</div> |
171 | 171 | </div> |
172 | 172 | <div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> </div> |
|
583 | 583 | <div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <span class="comment">// count the number of used entries in the sketch</span></div> |
584 | 584 | <div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> uint64_t num_nonzero = 0;</div> |
585 | 585 | <div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> entry: _sketch_array) {</div> |
586 | | -<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <span class="keywordflow">if</span> (entry != <span class="keyword">static_cast<</span>W<span class="keyword">></span>(0.0))</div> |
| 586 | +<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <span class="keywordflow">if</span> (entry != <span class="keyword">static_cast<</span>W<span class="keyword">></span>(0.0)){</div> |
587 | 587 | <div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> ++num_nonzero;</div> |
588 | | -<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> }</div> |
589 | | -<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> </div> |
590 | | -<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> <span class="comment">// Using a temporary stream for implementation here does not comply with AllocatorAwareContainer requirements.</span></div> |
591 | | -<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="comment">// The stream does not support passing an allocator instance, and alternatives are complicated.</span></div> |
592 | | -<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> std::ostringstream os;</div> |
593 | | -<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> os << <span class="stringliteral">"### Count Min sketch summary:"</span> << std::endl;</div> |
594 | | -<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> os << <span class="stringliteral">" num hashes : "</span> << <span class="keyword">static_cast<</span>uint32_t<span class="keyword">></span>(_num_hashes) << std::endl;</div> |
595 | | -<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> os << <span class="stringliteral">" num buckets : "</span> << _num_buckets << std::endl;</div> |
596 | | -<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> os << <span class="stringliteral">" capacity bins : "</span> << _sketch_array.size() << std::endl;</div> |
597 | | -<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> os << <span class="stringliteral">" filled bins : "</span> << num_nonzero << std::endl;</div> |
598 | | -<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> os << <span class="stringliteral">" pct filled : "</span> << std::setprecision(3) << (num_nonzero * 100.0) / _sketch_array.size() << <span class="stringliteral">"%"</span> << std::endl;</div> |
599 | | -<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> os << <span class="stringliteral">"### End sketch summary"</span> << std::endl;</div> |
600 | | -<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> </div> |
601 | | -<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> <span class="keywordflow">return</span> string<A>(os.str().c_str(), _allocator);</div> |
602 | | -<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span>}</div> |
603 | | -</div> |
604 | | -<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> </div> |
605 | | -<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span><span class="keyword">template</span><<span class="keyword">typename</span> W, <span class="keyword">typename</span> A></div> |
606 | | -<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span><span class="keywordtype">void</span> <a class="code hl_class" href="classdatasketches_1_1count__min__sketch.html">count_min_sketch<W,A>::check_header_validity</a>(uint8_t preamble_longs, uint8_t serial_version, uint8_t family_id, uint8_t flags_byte) {</div> |
607 | | -<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> empty = (flags_byte & (1 << flags::IS_EMPTY)) > 0;</div> |
608 | | -<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> </div> |
609 | | -<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> <span class="keyword">const</span> uint8_t sw = (empty ? 1 : 0) + (2 * serial_version) + (4 * family_id) + (32 * (preamble_longs & 0x3F));</div> |
610 | | -<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> <span class="keywordtype">bool</span> valid = <span class="keyword">true</span>;</div> |
611 | | -<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> </div> |
612 | | -<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> <span class="keywordflow">switch</span> (sw) { <span class="comment">// exhaustive list and description of all valid cases</span></div> |
613 | | -<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="keywordflow">case</span> 138 : <span class="keywordflow">break</span>; <span class="comment">// !empty, ser_ver==1, family==18, preLongs=2;</span></div> |
614 | | -<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> <span class="keywordflow">case</span> 139 : <span class="keywordflow">break</span>; <span class="comment">// empty, ser_ver==1, family==18, preLongs=2;</span></div> |
615 | | -<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <span class="comment">//case 170 : break; // !empty, ser_ver==1, family==18, preLongs=3;</span></div> |
616 | | -<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> default : <span class="comment">// all other case values are invalid</span></div> |
617 | | -<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> valid = <span class="keyword">false</span>;</div> |
618 | | -<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> }</div> |
619 | | -<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> </div> |
620 | | -<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> <span class="keywordflow">if</span> (!valid) {</div> |
621 | | -<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> std::ostringstream os;</div> |
622 | | -<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> os << <span class="stringliteral">"Possible sketch corruption. Inconsistent state: "</span></div> |
623 | | -<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> << <span class="stringliteral">"preamble_longs = "</span> << <span class="keyword">static_cast<</span>uint32_t<span class="keyword">></span>(preamble_longs)</div> |
624 | | -<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> << <span class="stringliteral">", empty = "</span> << (empty ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>)</div> |
625 | | -<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> << <span class="stringliteral">", serialization_version = "</span> << static_cast<uint32_t>(serial_version);</div> |
626 | | -<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> <span class="keywordflow">throw</span> std::invalid_argument(os.str());</div> |
627 | | -<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> }</div> |
628 | | -<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span>}</div> |
629 | | -<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> </div> |
630 | | -<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span>} <span class="comment">/* namespace datasketches */</span></div> |
631 | | -<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> </div> |
632 | | -<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span><span class="preprocessor">#endif</span></div> |
| 588 | +<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> }</div> |
| 589 | +<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> }</div> |
| 590 | +<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> </div> |
| 591 | +<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="comment">// Using a temporary stream for implementation here does not comply with AllocatorAwareContainer requirements.</span></div> |
| 592 | +<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> <span class="comment">// The stream does not support passing an allocator instance, and alternatives are complicated.</span></div> |
| 593 | +<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> std::ostringstream os;</div> |
| 594 | +<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> os << <span class="stringliteral">"### Count Min sketch summary:"</span> << std::endl;</div> |
| 595 | +<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> os << <span class="stringliteral">" num hashes : "</span> << <span class="keyword">static_cast<</span>uint32_t<span class="keyword">></span>(_num_hashes) << std::endl;</div> |
| 596 | +<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> os << <span class="stringliteral">" num buckets : "</span> << _num_buckets << std::endl;</div> |
| 597 | +<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> os << <span class="stringliteral">" capacity bins : "</span> << _sketch_array.size() << std::endl;</div> |
| 598 | +<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> os << <span class="stringliteral">" filled bins : "</span> << num_nonzero << std::endl;</div> |
| 599 | +<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> os << <span class="stringliteral">" pct filled : "</span> << std::setprecision(3) << (num_nonzero * 100.0) / _sketch_array.size() << <span class="stringliteral">"%"</span> << std::endl;</div> |
| 600 | +<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> os << <span class="stringliteral">"### End sketch summary"</span> << std::endl;</div> |
| 601 | +<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> </div> |
| 602 | +<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <span class="keywordflow">return</span> string<A>(os.str().c_str(), _allocator);</div> |
| 603 | +<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span>}</div> |
| 604 | +</div> |
| 605 | +<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> </div> |
| 606 | +<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span><span class="keyword">template</span><<span class="keyword">typename</span> W, <span class="keyword">typename</span> A></div> |
| 607 | +<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span><span class="keywordtype">void</span> <a class="code hl_class" href="classdatasketches_1_1count__min__sketch.html">count_min_sketch<W,A>::check_header_validity</a>(uint8_t preamble_longs, uint8_t serial_version, uint8_t family_id, uint8_t flags_byte) {</div> |
| 608 | +<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> empty = (flags_byte & (1 << flags::IS_EMPTY)) > 0;</div> |
| 609 | +<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> </div> |
| 610 | +<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> <span class="keyword">const</span> uint8_t sw = (empty ? 1 : 0) + (2 * serial_version) + (4 * family_id) + (32 * (preamble_longs & 0x3F));</div> |
| 611 | +<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> <span class="keywordtype">bool</span> valid = <span class="keyword">true</span>;</div> |
| 612 | +<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> </div> |
| 613 | +<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="keywordflow">switch</span> (sw) { <span class="comment">// exhaustive list and description of all valid cases</span></div> |
| 614 | +<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> <span class="keywordflow">case</span> 138 : <span class="keywordflow">break</span>; <span class="comment">// !empty, ser_ver==1, family==18, preLongs=2;</span></div> |
| 615 | +<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <span class="keywordflow">case</span> 139 : <span class="keywordflow">break</span>; <span class="comment">// empty, ser_ver==1, family==18, preLongs=2;</span></div> |
| 616 | +<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> <span class="comment">//case 170 : break; // !empty, ser_ver==1, family==18, preLongs=3;</span></div> |
| 617 | +<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> default : <span class="comment">// all other case values are invalid</span></div> |
| 618 | +<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> valid = <span class="keyword">false</span>;</div> |
| 619 | +<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> }</div> |
| 620 | +<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> </div> |
| 621 | +<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> <span class="keywordflow">if</span> (!valid) {</div> |
| 622 | +<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> std::ostringstream os;</div> |
| 623 | +<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> os << <span class="stringliteral">"Possible sketch corruption. Inconsistent state: "</span></div> |
| 624 | +<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> << <span class="stringliteral">"preamble_longs = "</span> << <span class="keyword">static_cast<</span>uint32_t<span class="keyword">></span>(preamble_longs)</div> |
| 625 | +<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> << <span class="stringliteral">", empty = "</span> << (empty ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>)</div> |
| 626 | +<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> << <span class="stringliteral">", serialization_version = "</span> << static_cast<uint32_t>(serial_version);</div> |
| 627 | +<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> <span class="keywordflow">throw</span> std::invalid_argument(os.str());</div> |
| 628 | +<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> }</div> |
| 629 | +<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span>}</div> |
| 630 | +<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> </div> |
| 631 | +<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span>} <span class="comment">/* namespace datasketches */</span></div> |
| 632 | +<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> </div> |
| 633 | +<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span><span class="preprocessor">#endif</span></div> |
633 | 634 | <div class="ttc" id="aclassdatasketches_1_1count__min__sketch_html"><div class="ttname"><a href="classdatasketches_1_1count__min__sketch.html">datasketches::count_min_sketch</a></div><div class="ttdoc">C++ implementation of the CountMin sketch data structure of Cormode and Muthukrishnan.</div><div class="ttdef"><b>Definition</b> count_min.hpp:37</div></div> |
634 | 635 | <div class="ttc" id="aclassdatasketches_1_1count__min__sketch_html_a0a9f344e0399b775f82358b8807727af"><div class="ttname"><a href="classdatasketches_1_1count__min__sketch.html#a0a9f344e0399b775f82358b8807727af">datasketches::count_min_sketch::deserialize</a></div><div class="ttdeci">static count_min_sketch deserialize(std::istream &is, uint64_t seed=DEFAULT_SEED, const Allocator &allocator=Allocator())</div><div class="ttdoc">This method deserializes a sketch from a given stream.</div></div> |
635 | 636 | <div class="ttc" id="aclassdatasketches_1_1count__min__sketch_html_a1bcdd98ee6e6eb9b501b8dc5de5e8924"><div class="ttname"><a href="classdatasketches_1_1count__min__sketch.html#a1bcdd98ee6e6eb9b501b8dc5de5e8924">datasketches::count_min_sketch::serialize</a></div><div class="ttdeci">void serialize(std::ostream &os) const</div><div class="ttdoc">This method serializes the sketch into a given stream in a binary form.</div><div class="ttdef"><b>Definition</b> count_min_impl.hpp:270</div></div> |
|
0 commit comments