1[/ 2 Copyright Hans Dembinski 2018 - 2019. 3 Distributed under the Boost Software License, Version 1.0. 4 (See accompanying file LICENSE_1_0.txt or copy at 5 https://www.boost.org/LICENSE_1_0.txt) 6] 7 8[section:history Revision history] 9 10[heading Boost 1.74] 11 12* New features 13 * New axis `boolean`, a special kind of integer axis with only two values and no state (except metadata) 14 * Histograms with growing category axes are now addable even if the categories differ; the category axis of the output histogram is the union of the category axes of the input histograms 15 * Added axis::traits::continuous to match axis::traits::is_continuous 16 17* Fixes 18 * `metadata()` method of builtin axis types now return a mutable reference even if the axis is const, as described in the documentation 19 20* Documentation 21 * Sorted headers in reference and sorted items in namespaces 22 * Removed some internal typenames from templates 23 * Added reference for `sample_type` 24 25* Other 26 * Simplified internal metaprogramming 27 * Replaced Boost Assert with plain cassert 28 29[heading Boost 1.73] 30 31* New features 32 * accumulators 33 * New `count` accumulator, a thin wrapper around a primitive arithmetic type; serves as a base class for users who want to add arbitrary metadata to each bin 34 * `sum` gained a `value()` method for consistency with other accumulators 35 * algorithm 36 * `reduce` 37 * Now supports positional commands 38 * `category` axis now supports `slice` command 39 * Added `crop` command, like `shrink`, but discards content of removed bins 40 * Renamed `reduce_option` to `reduce_command` (old name available but deprecated) 41 * `sum` gained a new argument, allowing users to select whether to sum over all bins or only the inner bins (excluding underflow and overflow) 42 * axis::traits 43 * Added traits `is_ordered` and `ordered` to distinguish between different kinds of DiscreteAxis types; used internally to handle `category` axis and `integer` axis differently 44 * Renamed `static_options` to `get_options` and `static_is_inclusive` to `is_inclusive` (old names available but deprecated) 45 46* Fixes 47 * Fixed failing ODR test in bundled Boost due to wrong paths 48 * Fixed a bug in histogram::operator*= that could occur in user-defined accumulators 49 * Fixed a bug in `indexed` which could cause arithmetic past the end position 50 * Fixed a bug where the variance in `accumulators::weighted_sum` was not correctly computed if a normal histogram was added to the histogram that used `accumulators::weighted_sum` 51 * Fixed a bug where compiling with `-ffast-math` would break `accumulators::sum` 52 * Fixed `algorithm::reduce` to work with axes without *flow bins, which did not compile before 53 54* Other 55 * Added an example and documentation on how to use Boost.Histogram as a backend 56 * Improved the docs on how to use custom accumulators and Boost.Accumulators 57 * Many small documentation improvements 58 * Improved docs for `algorithm::reduce` 59 * Improved experimental cmake build support 60 * Use `index_type` consistently everywhere instead of raw `int` 61 * Benchmark update in the docs 62 63[heading Boost 1.72] 64 65* New features 66 * Better deduction guides for axis types and histogram type on C++17 compilers 67 * performance improvements in the indexing code 68 * new histogram::fill method for accelerated filling from chunks of values 69 * ASCII bar charts for 1D histograms when boost/histogram/ostream.hpp is included (contributed by Przemyslaw Bartosik) 70 * Passing invalid axis options causes user-friendly compile-time errors 71 * Wrong usage of weight() and sample() causes user-friendly compile-time errors 72 * algorithm::empty returns true if all histogram values are equal to the default value (contributed by Henry Schreiner) 73 * algorithm::reduce with shrink is now well defined when values are not bin edges 74 * axis::traits::rank returns the number of values that this axis accepts 75 * axis::traits::is_continuous returns whether an axis is continuous or discrete 76 * axis::traits::is_inclusive returns whether an axis has a bin for any possible input 77 * limited weight support for mean accumulator 78 * accumulators::weighted_mean::sum_of_weights_squared method added 79 80* Fixes 81 * Support of -std=c++2a and -stdlib=libc++ on clang, compatibility with gcc-9 82 * Fixed: weight could be passed instead of a sample during filling without triggering an error 83 * Fixed: segfault when too many indices were passed to algorithm::project 84 * Fixed: indexed range generator did not work with storage based on std::array 85 * Fixed: weighted_mean() + weighted_mean() != weighted_mean() (discovered and reported by Henry Schreiner) 86 * Fixed: axis::option::test(...) returned true if any bits in the test mask were set (now returns true if all bits in the test mask are set) 87 * Protecting calls to min, max with against macro expansion 88 * Replaced all crlf with lf in concepts.qbk 89 * Missing throw of std::invalid_argument when user passes too many axes to histogram 90 * Corrected documentation of serialization support in concepts section 91 * Resolved warnings for various compiler versions 92 93* Other 94 * Added Boost.Histogram logo 95 * Added missing copyright notices 96 * axis::category::value returns copy for scalar types and const reference otherwise 97 * std::ostringstream not used anymore to generate exception messages to reduces code bloat 98 * Documentation improvements 99 * Restructured overview section in documentation 100 * Updated user guide to demonstrate new features 101 * Updated accumulator examples 102 * Concepts explain how accumulators can optionally accept weights 103 * Updated benchmark code 104 * New test checks consistency of b2 and cmake build systems 105 * New test checks One-Definition-Rule (fails if non-templated function is not declared inline) 106 * Serialization code decoupled from Boost.Serialization 107 * Removed dependency on Boost.CallableTraits 108 109[heading Boost 1.71] 110 111* New features 112 * Thread-safe accumulators boost::histogram::accumulators::thread_safe based on std::atomics 113 * Support for thread-safe storages 114 * Support for compiling without exceptions/RTTI (increases performance by 10-20 %) [with contributions from Glen Fernandez] 115 * Performance improvements for 1D and 2D histograms 116 * boost::histogram::indexed now returns forward iterator range instead of input iterator range 117 * boost::histogram::indexed_range::accessor is now non-copyable and acts like reference to cell value, making most algorithms from the stdlib work 118 * boost::histogram::algorithm::reduce 119 * New slice option 120 * Fuse shrink, slice, and rebin options passed for the same axis 121 * Support histograms with some axis types with reduction support 122 * boost::histogram::algorithm::project accepts runtime indices for static histograms 123 124* Fixes 125 * boost::histogram::algorithm::reduce also works on histograms that have some axis types without reduction support 126 * boost::histogram::axis::traits::update now works correctly for boost::histogram::axis::variant 127 128* Other 129 * 100 % test coverage 130 * Drastically reduced internal Boost dependencies 131 * Improved documentation and examples 132 * Internally replaced boost::variant with boost::variant2 133 * boost::histogram::axis::traits::is_reducible detects reducible axis types 134 * Cleanup and refactoring of internals 135 * Guarantee no-throw moves for all builtin axis types 136 * Improved internal benchmarks 137 * Compile cleanly at higher warning levels 138 139[heading Boost 1.70] 140 141First Boost release, version 4.0 in former internal counting. 142 143* Removed Python bindings, will be developed in separate repository 144* All axes can be made optionally circular, except category axis 145* All axes now support generic attached metadata 146* All axes have now independently configurable underflow/overflow extra bins 147* Removed circular axis (which is just a circular regular axis) 148* Added indexed adaptor generator for convenient and fast iteration over histograms 149* Support for axes that can grow in range 150* Support for axes which accept multiple values (example: hexagonal binning) 151* Support for profiles and more generally, arbitrary accumulators in each cell 152* Support for serializing to xml archives 153* Added compatibility with Boost.Range, Boost.Units, and Boost.Accumulators 154* Added deduction guides for axis types and histogram 155* Performance improvements 156* Renamed `adaptive_storage` to `unlimited_storage` 157* Replaced `boost::multiprecision::cpp_int` with custom type to decouple libraries 158* Internal simplification of `axis::variant` 159* Make all storages behave more like containers, simplifying the design 160* Histograms supports add, sub, mul, div 161* replaced `operator[]` in axis with explicit method `bin` 162* replaced `operator()` in axis with explicit method `index` 163* replaced internal use of `boost::containers` with stdlib containers 164* Much improved docs, reference documentation, user guide, more examples 165 166[heading 3.2 (not in Boost)] 167 168* Allocator support everywhere 169* Internal refactoring 170 171[heading 3.1 (not in Boost)] 172 173* Renamed `bincount` method to `size` 174* Support for axes with only overflow and no underflow bin 175* category axis now by default has bin for "other" input that does not fall 176 into the predefined categories, making it consistent with other axes 177* NaN is now consistently put into overflow bin for all axes 178* Eliminated warnings about safe internal conversions on MSVC 179* Established a cpp house style with corresponding .clang-format file 180* Better detection of Python library on all systems 181* Improved code coverage by testing more input errors 182* Raise ValueError instead of generic RuntimeError in Python on input errors 183 184[heading 3.0 (not in Boost)] 185 186* Support for efficient adding of multiple histograms and scaling 187* Re-design of category axis as a general mapping between unique values and bins 188* Re-design of the bin description an axis returns upon element access 189* Interface cleanup and simplification, more consistency between Python and C++ interface 190* Iterators for histogram and axes for STL compatibility 191* Regular axis in C++: Allowing transforms with state 192* Regular axis in Python: Support for all C++ transforms 193* Polymorphic axis::any type 194* Internal refactoring from boost::mpl and boost::fusion to std::tuple and boost::mp11 195* Windows support 196 197[heading 2.0 (not in Boost)] 198 199* Added static_histogram (v1.0 only had dynamic_histogram). 200* Merged wfill(...) and fill(...) interface. 201* Support custom allocators in storage classes. 202* Replaced static_storage with array_storage. 203* Replaced dynamic_storage with unlimited_storage, which adds the capability to grow the bin counter into a cpp_int, thus avoiding integer overflow completely. 204* Serialization uses binary_archive instead of text_archive. The latter is portable, but the performance is terrible. 205* Python interface changed: histograms are now iterable, returning axis classes 206* Support reduction (removing a subset of axes and returning the equivalent histogram; in other words, those axes are integrated over) 207 208[heading 1.0 (not in Boost)] 209 210* First stable version. 211 212[endsect] 213