3232#include < maths/MathsTypes.h>
3333
3434#include < boost/bind.hpp>
35+ #include < boost/make_unique.hpp>
3536#include < boost/numeric/conversion/bounds.hpp>
3637#include < boost/ref.hpp>
3738
@@ -50,10 +51,10 @@ namespace multivariate_multimodal_prior_detail {
5051
5152using TSizeDoublePr = std::pair<size_t , double >;
5253using TSizeDoublePr3Vec = core::CSmallVector<TSizeDoublePr, 3 >;
53- using TPriorPtr = std::shared_ptr<CMultivariatePrior>;
5454using TDouble10Vec1Vec = CMultivariatePrior::TDouble10Vec1Vec;
5555using TDouble10VecWeightsAry1Vec = CMultivariatePrior::TDouble10VecWeightsAry1Vec;
56- using TMode = SMultimodalPriorMode<std::shared_ptr<CMultivariatePrior>>;
56+ using TPriorPtr = std::unique_ptr<CMultivariatePrior>;
57+ using TMode = SMultimodalPriorMode<TPriorPtr>;
5758using TModeVec = std::vector<TMode>;
5859
5960// ! Implementation of a sample joint log marginal likelihood calculation.
@@ -134,7 +135,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
134135 using TMatrix = CSymmetricMatrixNxN<double , N>;
135136 using TMatrixVec = std::vector<TMatrix>;
136137 using TClusterer = CClusterer<TFloatPoint>;
137- using TClustererPtr = std::shared_ptr <TClusterer>;
138+ using TClustererPtr = std::unique_ptr <TClusterer>;
138139 using TPriorPtrVec = std::vector<TPriorPtr>;
139140
140141 // Lift all overloads of into scope.
@@ -162,13 +163,13 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
162163
163164 // ! Create from a collection of priors.
164165 // !
165- // ! \note The priors are shallow copied .
166+ // ! \note The priors are moved into place clearing the values in \p priors .
166167 // ! \note This constructor doesn't support subsequent update of the prior.
167168 CMultivariateMultimodalPrior (maths_t ::EDataType dataType, TPriorPtrVec& priors)
168169 : CMultivariatePrior(dataType, 0.0 ) {
169170 m_Modes.reserve (priors.size ());
170171 for (std::size_t i = 0u ; i < priors.size (); ++i) {
171- m_Modes.emplace_back (i, priors[i]);
172+ m_Modes.emplace_back (i, std::move ( priors[i]) );
172173 }
173174 }
174175
@@ -425,12 +426,12 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
425426 for (const auto & mode : m_Modes) {
426427 TUnivariatePriorPtrDoublePr prior (mode.s_Prior ->univariate (marginalize, condition));
427428 if (prior.first == nullptr ) {
428- return TUnivariatePriorPtrDoublePr () ;
429+ return {} ;
429430 }
430431 if (prior.first ->isNonInformative ()) {
431432 continue ;
432433 }
433- modes.push_back (prior.first );
434+ modes.push_back (std::move ( prior.first ) );
434435 weights.push_back (prior.second );
435436 maxWeight.add (weights.back ());
436437 }
@@ -444,8 +445,8 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
444445 modes[i]->numberSamples (weights[i] / Z * modes[i]->numberSamples ());
445446 }
446447
447- return {TUnivariatePriorPtr ( new CMultimodalPrior (this ->dataType (),
448- this ->decayRate (), modes) ),
448+ return {boost::make_unique< CMultimodalPrior> (this ->dataType (),
449+ this ->decayRate (), modes),
449450 Z > 0.0 ? maxWeight[0 ] + std::log (Z) : 0.0 };
450451 }
451452
@@ -465,7 +466,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
465466 const TSizeDoublePr10Vec& condition) const {
466467
467468 if (N == 2 ) {
468- return TPriorPtrDoublePr ( TPriorPtr (this ->clone ()), 0.0 ) ;
469+ return { TPriorPtr (this ->clone ()), 0.0 } ;
469470 }
470471
471472 std::size_t n = m_Modes.size ();
@@ -484,7 +485,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
484485 if (prior.first ->isNonInformative ()) {
485486 continue ;
486487 }
487- modes.push_back (prior.first );
488+ modes.push_back (std::move ( prior.first ) );
488489 weights.push_back (prior.second );
489490 maxWeight.add (weights.back ());
490491 }
@@ -498,7 +499,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
498499 modes[i]->numberSamples (weights[i] / Z * modes[i]->numberSamples ());
499500 }
500501
501- return {TPriorPtr ( new CMultivariateMultimodalPrior<2 >(this ->dataType (), modes) ),
502+ return {boost::make_unique< CMultivariateMultimodalPrior<2 >> (this ->dataType (), modes),
502503 Z > 0.0 ? maxWeight[0 ] + std::log (Z) : 0.0 };
503504 }
504505
@@ -905,7 +906,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
905906
906907 // Create the child modes.
907908 LOG_TRACE (<< " Creating mode with index " << leftSplitIndex);
908- modes.emplace_back (leftSplitIndex, m_Prior->m_SeedPrior );
909+ modes.emplace_back (leftSplitIndex, TPriorPtr ( m_Prior->m_SeedPrior -> clone ()) );
909910 {
910911 TPointVec samples;
911912 if (!m_Prior->m_Clusterer ->sample (
@@ -935,7 +936,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
935936 }
936937
937938 LOG_TRACE (<< " Creating mode with index " << rightSplitIndex);
938- modes.emplace_back (rightSplitIndex, m_Prior->m_SeedPrior );
939+ modes.emplace_back (rightSplitIndex, TPriorPtr ( m_Prior->m_SeedPrior -> clone ()) );
939940 {
940941 TPointVec samples;
941942 if (!m_Prior->m_Clusterer ->sample (
@@ -1025,7 +1026,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
10251026 MODE_TAG, TMode mode,
10261027 traverser.traverseSubLevel (boost::bind (
10271028 &TMode::acceptRestoreTraverser, &mode, boost::cref (params), _1)),
1028- m_Modes.push_back (mode))
1029+ m_Modes.push_back (std::move ( mode) ))
10291030 RESTORE_SETUP_TEARDOWN (
10301031 NUMBER_SAMPLES_TAG, double numberSamples,
10311032 core::CStringUtils::stringToType (traverser.value (), numberSamples),
0 commit comments