1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Getting started</title> 5<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> 6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 7<link rel="home" href="../index.html" title="Chapter 1. Boost.Histogram"> 8<link rel="up" href="../index.html" title="Chapter 1. Boost.Histogram"> 9<link rel="prev" href="overview.html" title="Overview"> 10<link rel="next" href="guide.html" title="User guide"> 11</head> 12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 13<table cellpadding="2" width="100%"><tr> 14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> 15<td align="center"><a href="../../../../../index.html">Home</a></td> 16<td align="center"><a href="../../../../libraries.htm">Libraries</a></td> 17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 19<td align="center"><a href="../../../../../more/index.htm">More</a></td> 20</tr></table> 21<hr> 22<div class="spirit-nav"> 23<a accesskey="p" href="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="guide.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 27<a name="histogram.getting_started"></a><a class="link" href="getting_started.html" title="Getting started">Getting started</a> 28</h2></div></div></div> 29<div class="toc"><dl class="toc"> 30<dt><span class="section"><a href="getting_started.html#histogram.getting_started.1d_histogram_with_axis_types_kno">1d-histogram 31 with axis types known at compile-time</a></span></dt> 32<dt><span class="section"><a href="getting_started.html#histogram.getting_started.3d_histogram_axis_configuration_">3d-histogram 33 (axis configuration defined at run-time)</a></span></dt> 34<dt><span class="section"><a href="getting_started.html#histogram.getting_started.1d_profile">1d-profile</a></span></dt> 35<dt><span class="section"><a href="getting_started.html#histogram.getting_started.standard_library_algorithms">Standard 36 library algorithms</a></span></dt> 37<dt><span class="section"><a href="getting_started.html#histogram.getting_started.making_classes_that_hold_histogr">Making 38 classes that hold histograms</a></span></dt> 39</dl></div> 40<p> 41 Here are some commented examples to copy-paste from, this should allow you 42 to kick off a project with Boost.Histogram. If you prefer a traditional structured 43 exposition, go to the <a class="link" href="guide.html" title="User guide">user guide</a>. 44 </p> 45<p> 46 Boost.Histogram uses <span class="emphasis"><em>axis</em></span> objects to convert input values 47 into indices. The library comes with several builtin axis types, which can 48 be configured via template parameters. This already gives you a lot of flexibility 49 should you need it, otherwise just use the defaults. Beyond that, you can easily 50 write your own axis type. 51 </p> 52<div class="section"> 53<div class="titlepage"><div><div><h3 class="title"> 54<a name="histogram.getting_started.1d_histogram_with_axis_types_kno"></a><a class="link" href="getting_started.html#histogram.getting_started.1d_histogram_with_axis_types_kno" title="1d-histogram with axis types known at compile-time">1d-histogram 55 with axis types known at compile-time</a> 56</h3></div></div></div> 57<p> 58 When the axis types for the histogram are known at compile-time, the library 59 generates the fastest and most efficient code for you. Here is such an example. 60 </p> 61<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> <span class="comment">// std::for_each</span> 62<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// only needed for printing</span> 63<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// make_histogram, regular, weight, indexed</span> 64<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> <span class="comment">// assert (used to test this example for correctness)</span> 65<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">functional</span><span class="special">></span> <span class="comment">// std::ref</span> 66<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> <span class="comment">// std::cout, std::flush</span> 67<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">sstream</span><span class="special">></span> <span class="comment">// std::ostringstream</span> 68 69<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 70 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span> <span class="comment">// strip the boost::histogram prefix</span> 71 72 <span class="comment">/* 73 Create a 1d-histogram with a regular axis that has 6 equidistant bins on 74 the real line from -1.0 to 2.0, and label it as "x". A family of overloaded 75 factory functions called `make_histogram` makes creating histograms easy. 76 77 A regular axis is a sequence of semi-open bins. Extra under- and overflow 78 bins extend the axis by default (this can be turned off). 79 80 index : -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 81 bin edges: -inf -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 inf 82 */</span> 83 <span class="keyword">auto</span> <span class="identifier">h</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>(</span><span class="number">6</span><span class="special">,</span> <span class="special">-</span><span class="number">1.0</span><span class="special">,</span> <span class="number">2.0</span><span class="special">,</span> <span class="string">"x"</span><span class="special">));</span> 84 85 <span class="comment">/* 86 Let's fill a histogram with data, typically this happens in a loop. 87 88 STL algorithms are supported. std::for_each is very convenient to fill a 89 histogram from an iterator range. Use std::ref in the call, if you don't 90 want std::for_each to make a copy of your histogram. 91 */</span> 92 <span class="keyword">auto</span> <span class="identifier">data</span> <span class="special">=</span> <span class="special">{-</span><span class="number">0.5</span><span class="special">,</span> <span class="number">1.1</span><span class="special">,</span> <span class="number">0.3</span><span class="special">,</span> <span class="number">1.7</span><span class="special">};</span> 93 <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">data</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">data</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">h</span><span class="special">));</span> 94 <span class="comment">// let's fill some more values manually</span> 95 <span class="identifier">h</span><span class="special">(-</span><span class="number">1.5</span><span class="special">);</span> <span class="comment">// is placed in underflow bin -1</span> 96 <span class="identifier">h</span><span class="special">(-</span><span class="number">1.0</span><span class="special">);</span> <span class="comment">// is placed in bin 0, bin interval is semi-open</span> 97 <span class="identifier">h</span><span class="special">(</span><span class="number">2.0</span><span class="special">);</span> <span class="comment">// is placed in overflow bin 6, bin interval is semi-open</span> 98 <span class="identifier">h</span><span class="special">(</span><span class="number">20.0</span><span class="special">);</span> <span class="comment">// is placed in overflow bin 6</span> 99 100 <span class="comment">/* 101 This does a weighted fill using the `weight` function as an additional 102 argument. It may appear at the beginning or end of the argument list. C++ 103 doesn't have keyword arguments like Python, this is the next-best thing. 104 */</span> 105 <span class="identifier">h</span><span class="special">(</span><span class="number">0.1</span><span class="special">,</span> <span class="identifier">weight</span><span class="special">(</span><span class="number">1.0</span><span class="special">));</span> 106 107 <span class="comment">/* 108 Iterate over bins with the `indexed` range generator, which provides a 109 special accessor object, that can be used to obtain the current bin index, 110 and the current bin value by dereferncing (it acts like a pointer to the 111 value). Using `indexed` is convenient and gives you better performance than 112 looping over the histogram cells with hand-written for loops. By default, 113 under- and overflow bins are skipped. Passing `coverage::all` as the 114 optional second argument iterates over all bins. 115 116 - Access the value with the dereference operator. 117 - Access the current index with `index(d)` method of the accessor. 118 - Access the corresponding bin interval view with `bin(d)`. 119 120 The return type of `bin(d)` depends on the axis type (see the axis reference 121 for details). It usually is a class that represents a semi-open interval. 122 Edges can be accessed with methods `lower()` and `upper()`. 123 */</span> 124 125 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostringstream</span> <span class="identifier">os</span><span class="special">;</span> 126 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span><span class="special">&&</span> <span class="identifier">x</span> <span class="special">:</span> <span class="identifier">indexed</span><span class="special">(</span><span class="identifier">h</span><span class="special">,</span> <span class="identifier">coverage</span><span class="special">::</span><span class="identifier">all</span><span class="special">))</span> <span class="special">{</span> 127 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">format</span><span class="special">(</span><span class="string">"bin %2i [%4.1f, %4.1f): %i\n"</span><span class="special">)</span> 128 <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">().</span><span class="identifier">lower</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">().</span><span class="identifier">upper</span><span class="special">()</span> <span class="special">%</span> <span class="special">*</span><span class="identifier">x</span><span class="special">;</span> 129 <span class="special">}</span> 130 131 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">flush</span><span class="special">;</span> 132 133 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">==</span> <span class="string">"bin -1 [-inf, -1.0): 1\n"</span> 134 <span class="string">"bin 0 [-1.0, -0.5): 1\n"</span> 135 <span class="string">"bin 1 [-0.5, -0.0): 1\n"</span> 136 <span class="string">"bin 2 [-0.0, 0.5): 2\n"</span> 137 <span class="string">"bin 3 [ 0.5, 1.0): 0\n"</span> 138 <span class="string">"bin 4 [ 1.0, 1.5): 1\n"</span> 139 <span class="string">"bin 5 [ 1.5, 2.0): 1\n"</span> 140 <span class="string">"bin 6 [ 2.0, inf): 2\n"</span><span class="special">);</span> 141<span class="special">}</span> 142</pre> 143<p> 144 We passed the <code class="computeroutput"><a class="link" href="../boost/histogram/axis/regular.html" title="Class template regular">regular</a></code> 145 axis type directly to the <code class="computeroutput"><a class="link" href="reference.html#header.boost.histogram.make_histogram_hpp" title="Header <boost/histogram/make_histogram.hpp>">make_histogram</a></code> 146 function. The library then generates a specialized histogram type with just 147 one regular axis from a generic template. 148 </p> 149<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 150<li class="listitem"> 151 Pro: Many user errors are already caught at compile-time, not at run-time. 152 </li> 153<li class="listitem"> 154 Con: You get template errors if you make a mistake, which may be hard 155 to read. We try to give you useful error messages, but still. 156 </li> 157</ul></div> 158</div> 159<div class="section"> 160<div class="titlepage"><div><div><h3 class="title"> 161<a name="histogram.getting_started.3d_histogram_axis_configuration_"></a><a class="link" href="getting_started.html#histogram.getting_started.3d_histogram_axis_configuration_" title="3d-histogram (axis configuration defined at run-time)">3d-histogram 162 (axis configuration defined at run-time)</a> 163</h3></div></div></div> 164<p> 165 Sometimes, you don't know the number or types of axes at compile-time, because 166 it depends on run-time information. Perhaps you want to write a command-line 167 tool that generates histograms from input data, or you use this library as 168 a back-end for a product with a GUI. This is possible as well, here is the 169 example. 170 </p> 171<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 172<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 173<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 174<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 175<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">sstream</span><span class="special">></span> 176<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">string</span><span class="special">></span> 177 178<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 179 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span> 180 181 <span class="comment">/* 182 Create a histogram which can be configured dynamically at run-time. The axis 183 configuration is first collected in a vector of axis::variant type, which 184 can hold different axis types (those in its template argument list). Here, 185 we use a variant that can store a regular and a category axis. 186 */</span> 187 <span class="keyword">using</span> <span class="identifier">reg</span> <span class="special">=</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>;</span> 188 <span class="keyword">using</span> <span class="identifier">cat</span> <span class="special">=</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">category</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>;</span> 189 <span class="keyword">using</span> <span class="identifier">variant</span> <span class="special">=</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">variant</span><span class="special"><</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>,</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">category</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>>;</span> 190 <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">variant</span><span class="special">></span> <span class="identifier">axes</span><span class="special">;</span> 191 <span class="identifier">axes</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">cat</span><span class="special">({</span><span class="string">"red"</span><span class="special">,</span> <span class="string">"blue"</span><span class="special">}));</span> 192 <span class="identifier">axes</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">reg</span><span class="special">(</span><span class="number">3</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">,</span> <span class="string">"x"</span><span class="special">));</span> 193 <span class="identifier">axes</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span><span class="identifier">reg</span><span class="special">(</span><span class="number">3</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">,</span> <span class="string">"y"</span><span class="special">));</span> 194 <span class="comment">// passing an iterator range also works here</span> 195 <span class="keyword">auto</span> <span class="identifier">h</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">axes</span><span class="special">));</span> 196 197 <span class="comment">// fill histogram with data, usually this happens in a loop</span> 198 <span class="identifier">h</span><span class="special">(</span><span class="string">"red"</span><span class="special">,</span> <span class="number">0.1</span><span class="special">,</span> <span class="number">0.2</span><span class="special">);</span> 199 <span class="identifier">h</span><span class="special">(</span><span class="string">"blue"</span><span class="special">,</span> <span class="number">0.7</span><span class="special">,</span> <span class="number">0.3</span><span class="special">);</span> 200 <span class="identifier">h</span><span class="special">(</span><span class="string">"red"</span><span class="special">,</span> <span class="number">0.3</span><span class="special">,</span> <span class="number">0.7</span><span class="special">);</span> 201 <span class="identifier">h</span><span class="special">(</span><span class="string">"red"</span><span class="special">,</span> <span class="number">0.7</span><span class="special">,</span> <span class="number">0.7</span><span class="special">);</span> 202 203 <span class="comment">/* 204 Print histogram by iterating over bins. 205 Since the [bin type] of the category axis cannot be converted into a double, 206 it cannot be handled by the polymorphic interface of axis::variant. We use 207 axis::get to "cast" the variant type to the actual category type. 208 */</span> 209 210 <span class="comment">// get reference to category axis, performs a run-time checked static cast</span> 211 <span class="keyword">const</span> <span class="keyword">auto</span><span class="special">&</span> <span class="identifier">cat_axis</span> <span class="special">=</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">get</span><span class="special"><</span><span class="identifier">cat</span><span class="special">>(</span><span class="identifier">h</span><span class="special">.</span><span class="identifier">axis</span><span class="special">(</span><span class="number">0</span><span class="special">));</span> 212 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostringstream</span> <span class="identifier">os</span><span class="special">;</span> 213 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span><span class="special">&&</span> <span class="identifier">x</span> <span class="special">:</span> <span class="identifier">indexed</span><span class="special">(</span><span class="identifier">h</span><span class="special">))</span> <span class="special">{</span> 214 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">format</span><span class="special">(</span><span class="string">"(%i, %i, %i) %4s [%3.1f, %3.1f) [%3.1f, %3.1f) %3.0f\n"</span><span class="special">)</span> 215 <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> 216 <span class="special">%</span> <span class="identifier">cat_axis</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">(</span><span class="number">0</span><span class="special">))</span> 217 <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="number">1</span><span class="special">).</span><span class="identifier">lower</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="number">1</span><span class="special">).</span><span class="identifier">upper</span><span class="special">()</span> 218 <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="number">2</span><span class="special">).</span><span class="identifier">lower</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">(</span><span class="number">2</span><span class="special">).</span><span class="identifier">upper</span><span class="special">()</span> 219 <span class="special">%</span> <span class="special">*</span><span class="identifier">x</span><span class="special">;</span> 220 <span class="special">}</span> 221 222 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">flush</span><span class="special">;</span> 223 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">==</span> <span class="string">"(0, 0, 0) red [0.0, 0.3) [0.0, 0.3) 1\n"</span> 224 <span class="string">"(1, 0, 0) blue [0.0, 0.3) [0.0, 0.3) 0\n"</span> 225 <span class="string">"(0, 1, 0) red [0.3, 0.7) [0.0, 0.3) 0\n"</span> 226 <span class="string">"(1, 1, 0) blue [0.3, 0.7) [0.0, 0.3) 0\n"</span> 227 <span class="string">"(0, 2, 0) red [0.7, 1.0) [0.0, 0.3) 0\n"</span> 228 <span class="string">"(1, 2, 0) blue [0.7, 1.0) [0.0, 0.3) 1\n"</span> 229 <span class="string">"(0, 0, 1) red [0.0, 0.3) [0.3, 0.7) 0\n"</span> 230 <span class="string">"(1, 0, 1) blue [0.0, 0.3) [0.3, 0.7) 0\n"</span> 231 <span class="string">"(0, 1, 1) red [0.3, 0.7) [0.3, 0.7) 0\n"</span> 232 <span class="string">"(1, 1, 1) blue [0.3, 0.7) [0.3, 0.7) 0\n"</span> 233 <span class="string">"(0, 2, 1) red [0.7, 1.0) [0.3, 0.7) 0\n"</span> 234 <span class="string">"(1, 2, 1) blue [0.7, 1.0) [0.3, 0.7) 0\n"</span> 235 <span class="string">"(0, 0, 2) red [0.0, 0.3) [0.7, 1.0) 1\n"</span> 236 <span class="string">"(1, 0, 2) blue [0.0, 0.3) [0.7, 1.0) 0\n"</span> 237 <span class="string">"(0, 1, 2) red [0.3, 0.7) [0.7, 1.0) 0\n"</span> 238 <span class="string">"(1, 1, 2) blue [0.3, 0.7) [0.7, 1.0) 0\n"</span> 239 <span class="string">"(0, 2, 2) red [0.7, 1.0) [0.7, 1.0) 1\n"</span> 240 <span class="string">"(1, 2, 2) blue [0.7, 1.0) [0.7, 1.0) 0\n"</span><span class="special">);</span> 241<span class="special">}</span> 242</pre> 243<p> 244 The axis configuration is passed to <code class="computeroutput"><span class="identifier">make_histogram</span></code> 245 as a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">variant</span><span class="special"><...>></span></code>, 246 which can hold arbitrary sequences of axis types from a predefined set. 247 </p> 248<p> 249 Run-time configurable histograms are a slower than their compile-time brethren, 250 but still pretty fast. 251 </p> 252<div class="note"><table border="0" summary="Note"> 253<tr> 254<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> 255<th align="left">Note</th> 256</tr> 257<tr><td align="left" valign="top"><p> 258 If you know already at compile-time that you will only use one axis type, 259 <code class="computeroutput"><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><></span></code> 260 for example, but not how many per histogram, then you can also pass a 261 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>></span></code> 262 to <code class="computeroutput"><span class="identifier">make_histogram</span></code>. You 263 get almost the same speed as in the very first case, where both the axis 264 configuration was fully known at compile-time. 265 </p></td></tr> 266</table></div> 267<div class="note"><table border="0" summary="Note"> 268<tr> 269<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> 270<th align="left">Note</th> 271</tr> 272<tr><td align="left" valign="top"><p> 273 If you care about maximum performance: In this example, <code class="computeroutput"><span class="identifier">axis</span><span class="special">::</span><span class="identifier">category</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">></span></code> is used with two string labels "red" 274 and "blue". It is faster to use an enum, <code class="computeroutput"><span class="keyword">enum</span> 275 <span class="special">{</span> <span class="identifier">red</span><span class="special">,</span> <span class="identifier">blue</span> <span class="special">};</span></code> and a <code class="computeroutput"><span class="identifier">axis</span><span class="special">::</span><span class="identifier">category</span><span class="special"><></span></code> axis. 276 </p></td></tr> 277</table></div> 278</div> 279<div class="section"> 280<div class="titlepage"><div><div><h3 class="title"> 281<a name="histogram.getting_started.1d_profile"></a><a class="link" href="getting_started.html#histogram.getting_started.1d_profile" title="1d-profile">1d-profile</a> 282</h3></div></div></div> 283<p> 284 The library was designed to be very flexible and modular. The modularity 285 is used, for example, to also provide profiles. Profiles are generalized 286 histograms. A histogram counts how often an input falls into a particular 287 cell. A profile accepts pairs of input values and a sample value. The profile 288 computes the mean of the samples that end up in each cell. Have a look at 289 the example, which should clear up any confusion. 290 </p> 291<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 292<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 293<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 294<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> 295<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">sstream</span><span class="special">></span> 296 297<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 298 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span> 299 300 <span class="comment">/* 301 Create a profile. Profiles does not only count entries in each cell, but 302 also compute the mean of a sample value in each cell. 303 */</span> 304 <span class="keyword">auto</span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">make_profile</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>(</span><span class="number">5</span><span class="special">,</span> <span class="number">0.0</span><span class="special">,</span> <span class="number">1.0</span><span class="special">));</span> 305 306 <span class="comment">/* 307 Fill profile with data, usually this happens in a loop. You pass the sample 308 with the `sample` helper function. The sample can be the first or last 309 argument. 310 */</span> 311 <span class="identifier">p</span><span class="special">(</span><span class="number">0.1</span><span class="special">,</span> <span class="identifier">sample</span><span class="special">(</span><span class="number">1</span><span class="special">));</span> 312 <span class="identifier">p</span><span class="special">(</span><span class="number">0.15</span><span class="special">,</span> <span class="identifier">sample</span><span class="special">(</span><span class="number">3</span><span class="special">));</span> 313 <span class="identifier">p</span><span class="special">(</span><span class="number">0.2</span><span class="special">,</span> <span class="identifier">sample</span><span class="special">(</span><span class="number">4</span><span class="special">));</span> 314 <span class="identifier">p</span><span class="special">(</span><span class="number">0.9</span><span class="special">,</span> <span class="identifier">sample</span><span class="special">(</span><span class="number">5</span><span class="special">));</span> 315 316 <span class="comment">/* 317 Iterate over bins and print profile. 318 */</span> 319 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostringstream</span> <span class="identifier">os</span><span class="special">;</span> 320 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">auto</span><span class="special">&&</span> <span class="identifier">x</span> <span class="special">:</span> <span class="identifier">indexed</span><span class="special">(</span><span class="identifier">p</span><span class="special">))</span> <span class="special">{</span> 321 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">format</span><span class="special">(</span><span class="string">"bin %i [%3.1f, %3.1f) count %i mean %g\n"</span><span class="special">)</span> 322 <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">index</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">().</span><span class="identifier">lower</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">bin</span><span class="special">().</span><span class="identifier">upper</span><span class="special">()</span> 323 <span class="special">%</span> <span class="identifier">x</span><span class="special">-></span><span class="identifier">count</span><span class="special">()</span> <span class="special">%</span> <span class="identifier">x</span><span class="special">-></span><span class="identifier">value</span><span class="special">();</span> 324 <span class="special">}</span> 325 326 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">flush</span><span class="special">;</span> 327 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">==</span> <span class="string">"bin 0 [0.0, 0.2) count 2 mean 2\n"</span> 328 <span class="string">"bin 1 [0.2, 0.4) count 1 mean 4\n"</span> 329 <span class="string">"bin 2 [0.4, 0.6) count 0 mean 0\n"</span> 330 <span class="string">"bin 3 [0.6, 0.8) count 0 mean 0\n"</span> 331 <span class="string">"bin 4 [0.8, 1.0) count 1 mean 5\n"</span><span class="special">);</span> 332<span class="special">}</span> 333</pre> 334</div> 335<div class="section"> 336<div class="titlepage"><div><div><h3 class="title"> 337<a name="histogram.getting_started.standard_library_algorithms"></a><a class="link" href="getting_started.html#histogram.getting_started.standard_library_algorithms" title="Standard library algorithms">Standard 338 library algorithms</a> 339</h3></div></div></div> 340<p> 341 The library was designed to work well with the C++ standard library. Here 342 is an example on how to get the most common color from an image, using a 343 3d histogram and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">max_element</span></code>. 344 </p> 345<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> <span class="comment">// std::max_element</span> 346<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// only needed for printing</span> 347<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// make_histogram, integer, indexed</span> 348<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> <span class="comment">// std::cout, std::endl</span> 349<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">sstream</span><span class="special">></span> <span class="comment">// std::ostringstream</span> 350 351<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 352 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span> 353 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">literals</span><span class="special">;</span> 354 355 <span class="comment">/* 356 We make a 3d histogram for color values (r, g, b) in an image. We assume the values 357 are of type char. The value range then is [0, 256). The integer axis is perfect for 358 color values. 359 */</span> 360 <span class="keyword">auto</span> <span class="identifier">h</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span> 361 <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><>(</span><span class="number">0</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="string">"r"</span><span class="special">),</span> 362 <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><>(</span><span class="number">0</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="string">"g"</span><span class="special">),</span> 363 <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><>(</span><span class="number">0</span><span class="special">,</span> <span class="number">256</span><span class="special">,</span> <span class="string">"b"</span><span class="special">)</span> 364 <span class="special">);</span> 365 366 <span class="comment">/* 367 We don't have real image data, so fill some fake data. 368 */</span> 369 <span class="identifier">h</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">);</span> 370 <span class="identifier">h</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">);</span> 371 <span class="identifier">h</span><span class="special">(</span><span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">0</span><span class="special">);</span> 372 373 <span class="comment">/* 374 Now let's say we want to know which color is most common. We can use std::max_element 375 on an indexed range for that. 376 */</span> 377 <span class="keyword">auto</span> <span class="identifier">ind</span> <span class="special">=</span> <span class="identifier">indexed</span><span class="special">(</span><span class="identifier">h</span><span class="special">);</span> 378 <span class="keyword">auto</span> <span class="identifier">max_it</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">max_element</span><span class="special">(</span><span class="identifier">ind</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">ind</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span> 379 380 <span class="comment">/* 381 max_it is a special iterator to the histogram cell with the highest count. 382 This iterator allows one to access the cell value, bin indices, and bin values. 383 You need to twice dereference it to get to the cell value. 384 */</span> 385 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostringstream</span> <span class="identifier">os</span><span class="special">;</span> 386 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">format</span><span class="special">(</span><span class="string">"count=%i rgb=(%i, %i, %i)"</span><span class="special">)</span> 387 <span class="special">%</span> <span class="special">**</span><span class="identifier">max_it</span> <span class="special">%</span> <span class="identifier">max_it</span><span class="special">-></span><span class="identifier">bin</span><span class="special">(</span><span class="number">0</span><span class="identifier">_c</span><span class="special">)</span> <span class="special">%</span> <span class="identifier">max_it</span><span class="special">-></span><span class="identifier">bin</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special">%</span> <span class="identifier">max_it</span><span class="special">-></span><span class="identifier">bin</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> 388 389 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 390 391 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">os</span><span class="special">.</span><span class="identifier">str</span><span class="special">()</span> <span class="special">==</span> <span class="string">"count=2 rgb=(1, 2, 3)"</span><span class="special">);</span> 392<span class="special">}</span> 393</pre> 394</div> 395<div class="section"> 396<div class="titlepage"><div><div><h3 class="title"> 397<a name="histogram.getting_started.making_classes_that_hold_histogr"></a><a class="link" href="getting_started.html#histogram.getting_started.making_classes_that_hold_histogr" title="Making classes that hold histograms">Making 398 classes that hold histograms</a> 399</h3></div></div></div> 400<p> 401 The histograms get their great flexibility and performance from being templated, 402 but this can make the types a bit cumbersome to write. Often it is possible 403 to use <code class="computeroutput"><span class="keyword">auto</span></code> to let the compiler 404 deduce the type, but when you want to store histograms in a class, you need 405 to write the type explicitly. The next example shows how this works. 406 </p> 407<pre class="programlisting"><span class="comment">//////////////// Begin: put this in header file ////////////////////</span> 408 409<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> <span class="comment">// std::max_element</span> 410<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">format</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// only needed for printing</span> 411<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">histogram</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// make_histogram, integer, indexed</span> 412<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> <span class="comment">// std::cout, std::endl</span> 413<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">sstream</span><span class="special">></span> <span class="comment">// std::ostringstream</span> 414<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">tuple</span><span class="special">></span> 415<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span> 416 417<span class="comment">// use this when axis configuration is fix to get highest performance</span> 418<span class="keyword">struct</span> <span class="identifier">HolderOfStaticHistogram</span> <span class="special">{</span> 419 <span class="comment">// put axis types here</span> 420 <span class="keyword">using</span> <span class="identifier">axes_t</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> 421 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>,</span> 422 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><></span> 423 <span class="special">>;</span> 424 <span class="keyword">using</span> <span class="identifier">hist_t</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">histogram</span><span class="special"><</span><span class="identifier">axes_t</span><span class="special">>;</span> 425 <span class="identifier">hist_t</span> <span class="identifier">hist_</span><span class="special">;</span> 426<span class="special">};</span> 427 428<span class="comment">// use this when axis configuration should be flexible</span> 429<span class="keyword">struct</span> <span class="identifier">HolderOfDynamicHistogram</span> <span class="special">{</span> 430 <span class="comment">// put all axis types here that you are going to use</span> 431 <span class="keyword">using</span> <span class="identifier">axis_t</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">variant</span><span class="special"><</span> 432 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>,</span> 433 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">variable</span><span class="special"><>,</span> 434 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><></span> 435 <span class="special">>;</span> 436 <span class="keyword">using</span> <span class="identifier">axes_t</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">axis_t</span><span class="special">>;</span> 437 <span class="keyword">using</span> <span class="identifier">hist_t</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">::</span><span class="identifier">histogram</span><span class="special"><</span><span class="identifier">axes_t</span><span class="special">>;</span> 438 <span class="identifier">hist_t</span> <span class="identifier">hist_</span><span class="special">;</span> 439<span class="special">};</span> 440 441<span class="comment">//////////////// End: put this in header file ////////////////////</span> 442 443<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span> 444 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">histogram</span><span class="special">;</span> 445 446 <span class="identifier">HolderOfStaticHistogram</span> <span class="identifier">hs</span><span class="special">;</span> 447 <span class="identifier">hs</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>(</span><span class="number">5</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">),</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><>(</span><span class="number">0</span><span class="special">,</span> <span class="number">3</span><span class="special">));</span> 448 <span class="comment">// now assign a different histogram</span> 449 <span class="identifier">hs</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>(</span><span class="number">3</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">),</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><>(</span><span class="number">4</span><span class="special">,</span> <span class="number">6</span><span class="special">));</span> 450 <span class="comment">// hs.hist_ = make_histogram(axis::regular<>(5, 0, 1)); does not work;</span> 451 <span class="comment">// the static histogram cannot change the number or order of axis types</span> 452 453 <span class="identifier">HolderOfDynamicHistogram</span> <span class="identifier">hd</span><span class="special">;</span> 454 <span class="identifier">hd</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>(</span><span class="number">5</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">),</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><>(</span><span class="number">0</span><span class="special">,</span> <span class="number">3</span><span class="special">));</span> 455 <span class="comment">// now assign a different histogram</span> 456 <span class="identifier">hd</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">regular</span><span class="special"><>(</span><span class="number">3</span><span class="special">,</span> <span class="special">-</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">));</span> 457 <span class="comment">// and assign another</span> 458 <span class="identifier">hd</span><span class="special">.</span><span class="identifier">hist_</span> <span class="special">=</span> <span class="identifier">make_histogram</span><span class="special">(</span><span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><>(</span><span class="number">0</span><span class="special">,</span> <span class="number">5</span><span class="special">),</span> <span class="identifier">axis</span><span class="special">::</span><span class="identifier">integer</span><span class="special"><>(</span><span class="number">3</span><span class="special">,</span> <span class="number">5</span><span class="special">));</span> 459<span class="special">}</span> 460</pre> 461</div> 462</div> 463<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 464<td align="left"></td> 465<td align="right"><div class="copyright-footer">Copyright © 2016-2019 Hans 466 Dembinski<p> 467 Distributed under the Boost Software License, Version 1.0. (See accompanying 468 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 469 </p> 470</div></td> 471</tr></table> 472<hr> 473<div class="spirit-nav"> 474<a accesskey="p" href="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="guide.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> 475</div> 476</body> 477</html> 478