<p>This code is a start to the use of <code>boost::serialization</code> instead of the current <code>SaveRestoreUtility</code> mess. If your mlpack class implements a <code>Serialize()</code> function, then you can use <code>boost::serialization</code> to save it:</p>
<pre><code>MyClass myclass(...);
boost::archive::xml_oarchive oarch("my_file.xml"); // or binary_oarchive or text_oarchive
oarch << data::CreateNVP(myclass, "myclass"); // create a name-value pair for saving
</code></pre>
<p>and to load it:</p>
<pre><code>MyClass myclass(...);
boost::archive::xml_iarchive iarch("my_file.xml"); // or binary_iarchive or text_iarchive
iarch >> data::CreateNVP(myclass, "myclass"); // use the same name-value pair as before
</code></pre>
<p>This involved writing a confusing, complex shim object so we could write <code>Serialize()</code> in accordance with the mlpack method naming guidelines instead of <code>serialize()</code>, for the sake of consistency. Certainly there is more documentation to be done before a release; specifically, classes that use references are probably going to need some amount of refactoring (see what I had to do to <code>BinarySpaceTree</code>, for instance).</p>
<p>I've opened a PR instead of just merging it in, in order to give an opportunity to say "no, don't do it!". I'll probably leave this open for a week or two before merging.</p>
<hr>
<h4>You can view, comment on, or merge this pull request online at:</h4>
<p> <a href='https://github.com/mlpack/mlpack/pull/443'>https://github.com/mlpack/mlpack/pull/443</a></p>
<h4>Commit Summary</h4>
<ul>
<li>Add wrapper for boost::serialization.</li>
<li>Add list of formats we can load.</li>
<li>Update CMakeLists.txt.</li>
<li>Convenience function for extracting extensions.</li>
<li>Add Load() and Save() for models.</li>
<li>Move serialization shim to data/.</li>
<li>Fix syntax and include errors.</li>
<li>Add boost::serialization to dependencies.</li>
<li>A few first tests for serialization.</li>
<li>Add serialization for arma::mat.</li>
<li>Add serialization for sparse matrices.</li>
<li>Refactor includes to include serialization code.</li>
<li>Add Serialize() to distributions.</li>
<li>Add tests for distribution Serialize().</li>
<li>Add Serialize() to kernels; not yet tested.</li>
<li>Add Range::Serialize().</li>
<li>Refactor and add Serialize().</li>
<li>Add Serialize() to MahalanobisDistance.</li>
<li>Clarify comments, fix accessors.</li>
<li>Add BallBound<>::Serialize().</li>
<li>Some serialization changes.</li>
<li>Allow serialization of linear regression.</li>
<li>Add shims for arrays.</li>
<li>Fix typo.</li>
<li>Comment out unused member.</li>
<li>Fix memory misuse.</li>
<li>Add shims for pointers.</li>
<li>Update comment for serialize() interception.</li>
<li>Add Serialize() for empty class.</li>
<li>Be safer with memory usage.</li>
<li>Add Serialize() for HRectBound<>.</li>
<li>Add some more tests.</li>
<li>A first pass at refactoring BinarySpaceTree.</li>
<li>Refactor tree test.</li>
<li>Merge branch 'master' into serialize</li>
<li>Refactor NeighborSearch internals to deal with the tree holding the dataset internally.</li>
<li>Refactor tests to deal with modified NeighborSearch.</li>
<li>Merge branch 'master' into serialize</li>
<li>Add serialization for statistic.</li>
<li>Fix memory leak when overwriting bounds.</li>
<li>Add BinarySpaceTree::Serialize() and tests.</li>
<li>Fix some style.</li>
<li>Remove unnecessary LastDistanceNode().</li>
<li>Add Serialize(); remove unnecessary LastDistanceNode().</li>
</ul>
<h4>File Changes</h4>
<ul>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-0">CMakeLists.txt</a>
(1)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-1">src/mlpack/core/arma_extend/Mat_extra_bones.hpp</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-2">src/mlpack/core/arma_extend/Mat_extra_meat.hpp</a>
(32)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-3">src/mlpack/core/arma_extend/SpMat_extra_bones.hpp</a>
(6)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-4">src/mlpack/core/arma_extend/SpMat_extra_meat.hpp</a>
(34)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-5">src/mlpack/core/arma_extend/arma_extend.hpp</a>
(5)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-6">src/mlpack/core/data/CMakeLists.txt</a>
(3)
</li>
<li>
<strong>A</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-7">src/mlpack/core/data/extension.hpp</a>
(33)
</li>
<li>
<strong>A</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-8">src/mlpack/core/data/format.hpp</a>
(26)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-9">src/mlpack/core/data/load.hpp</a>
(42)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-10">src/mlpack/core/data/load_impl.hpp</a>
(109)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-11">src/mlpack/core/data/save.hpp</a>
(40)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-12">src/mlpack/core/data/save_impl.hpp</a>
(95)
</li>
<li>
<strong>A</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-13">src/mlpack/core/data/serialization_shim.hpp</a>
(575)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-14">src/mlpack/core/dists/discrete_distribution.hpp</a>
(11)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-15">src/mlpack/core/dists/gaussian_distribution.cpp</a>
(3)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-16">src/mlpack/core/dists/gaussian_distribution.hpp</a>
(16)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-17">src/mlpack/core/dists/laplace_distribution.hpp</a>
(10)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-18">src/mlpack/core/dists/regression_distribution.hpp</a>
(23)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-19">src/mlpack/core/kernels/cosine_distance.hpp</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-20">src/mlpack/core/kernels/epanechnikov_kernel.hpp</a>
(6)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-21">src/mlpack/core/kernels/epanechnikov_kernel_impl.hpp</a>
(9)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-22">src/mlpack/core/kernels/example_kernel.hpp</a>
(7)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-23">src/mlpack/core/kernels/gaussian_kernel.hpp</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-24">src/mlpack/core/kernels/hyperbolic_tangent_kernel.hpp</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-25">src/mlpack/core/kernels/laplacian_kernel.hpp</a>
(7)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-26">src/mlpack/core/kernels/linear_kernel.hpp</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-27">src/mlpack/core/kernels/polynomial_kernel.hpp</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-28">src/mlpack/core/kernels/spherical_kernel.hpp</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-29">src/mlpack/core/kernels/triangular_kernel.hpp</a>
(7)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-30">src/mlpack/core/math/range.hpp</a>
(6)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-31">src/mlpack/core/math/range_impl.hpp</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-32">src/mlpack/core/metrics/ip_metric.hpp</a>
(16)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-33">src/mlpack/core/metrics/ip_metric_impl.hpp</a>
(33)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-34">src/mlpack/core/metrics/lmetric.hpp</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-35">src/mlpack/core/metrics/mahalanobis_distance.hpp</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-36">src/mlpack/core/metrics/mahalanobis_distance_impl.hpp</a>
(9)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-37">src/mlpack/core/tree/ballbound.hpp</a>
(19)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-38">src/mlpack/core/tree/ballbound_impl.hpp</a>
(21)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-39">src/mlpack/core/tree/binary_space_tree/binary_space_tree.hpp</a>
(117)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-40">src/mlpack/core/tree/binary_space_tree/binary_space_tree_impl.hpp</a>
(229)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-41">src/mlpack/core/tree/hrectbound.hpp</a>
(6)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-42">src/mlpack/core/tree/hrectbound_impl.hpp</a>
(20)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-43">src/mlpack/core/tree/statistic.hpp</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-44">src/mlpack/core/util/sfinae_utility.hpp</a>
(1)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-45">src/mlpack/methods/linear_regression/linear_regression.hpp</a>
(22)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-46">src/mlpack/methods/neighbor_search/neighbor_search.hpp</a>
(11)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-47">src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp</a>
(56)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-48">src/mlpack/methods/neighbor_search/neighbor_search_stat.hpp</a>
(18)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-49">src/mlpack/methods/range_search/range_search_stat.hpp</a>
(9)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-50">src/mlpack/prereqs.hpp</a>
(5)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-51">src/mlpack/tests/CMakeLists.txt</a>
(1)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-52">src/mlpack/tests/allkfn_test.cpp</a>
(7)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-53">src/mlpack/tests/allknn_test.cpp</a>
(7)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-54">src/mlpack/tests/load_save_test.cpp</a>
(106)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-55">src/mlpack/tests/range_search_test.cpp</a>
(1)
</li>
<li>
<strong>A</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-56">src/mlpack/tests/serialization_test.cpp</a>
(688)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/mlpack/mlpack/pull/443/files#diff-57">src/mlpack/tests/tree_test.cpp</a>
(84)
</li>
</ul>
<h4>Patch Links:</h4>
<ul>
<li><a href='https://github.com/mlpack/mlpack/pull/443.patch'>https://github.com/mlpack/mlpack/pull/443.patch</a></li>
<li><a href='https://github.com/mlpack/mlpack/pull/443.diff'>https://github.com/mlpack/mlpack/pull/443.diff</a></li>
</ul>
<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br>Reply to this email directly or <a href="https://github.com/mlpack/mlpack/pull/443">view it on GitHub</a>.<img alt="" height="1" src="https://github.com/notifications/beacon/AJ4bFMgt_J5uGBfNbFYSMMX-qVP2AP4pks5oWukbgaJpZM4FLEcg.gif" width="1" /></p>
<div itemscope itemtype="http://schema.org/EmailMessage">
<div itemprop="action" itemscope itemtype="http://schema.org/ViewAction">
<link itemprop="url" href="https://github.com/mlpack/mlpack/pull/443"></link>
<meta itemprop="name" content="View Pull Request"></meta>
</div>
<meta itemprop="description" content="View this Pull Request on GitHub"></meta>
</div>