3232#include < maths/MathsTypes.h>
3333
3434#include < boost/bind.hpp>
35- #include < boost/make_unique.hpp>
3635#include < boost/numeric/conversion/bounds.hpp>
3736#include < boost/ref.hpp>
3837
@@ -51,10 +50,10 @@ namespace multivariate_multimodal_prior_detail {
5150
5251using TSizeDoublePr = std::pair<size_t , double >;
5352using TSizeDoublePr3Vec = core::CSmallVector<TSizeDoublePr, 3 >;
53+ using TPriorPtr = std::shared_ptr<CMultivariatePrior>;
5454using TDouble10Vec1Vec = CMultivariatePrior::TDouble10Vec1Vec;
5555using TDouble10VecWeightsAry1Vec = CMultivariatePrior::TDouble10VecWeightsAry1Vec;
56- using TPriorPtr = std::unique_ptr<CMultivariatePrior>;
57- using TMode = SMultimodalPriorMode<TPriorPtr>;
56+ using TMode = SMultimodalPriorMode<std::shared_ptr<CMultivariatePrior>>;
5857using TModeVec = std::vector<TMode>;
5958
6059// ! Implementation of a sample joint log marginal likelihood calculation.
@@ -135,7 +134,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
135134 using TMatrix = CSymmetricMatrixNxN<double , N>;
136135 using TMatrixVec = std::vector<TMatrix>;
137136 using TClusterer = CClusterer<TFloatPoint>;
138- using TClustererPtr = std::unique_ptr <TClusterer>;
137+ using TClustererPtr = std::shared_ptr <TClusterer>;
139138 using TPriorPtrVec = std::vector<TPriorPtr>;
140139
141140 // Lift all overloads of into scope.
@@ -163,13 +162,13 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
163162
164163 // ! Create from a collection of priors.
165164 // !
166- // ! \note The priors are moved into place clearing the values in \p priors .
165+ // ! \note The priors are shallow copied .
167166 // ! \note This constructor doesn't support subsequent update of the prior.
168167 CMultivariateMultimodalPrior (maths_t ::EDataType dataType, TPriorPtrVec& priors)
169168 : CMultivariatePrior(dataType, 0.0 ) {
170169 m_Modes.reserve (priors.size ());
171170 for (std::size_t i = 0u ; i < priors.size (); ++i) {
172- m_Modes.emplace_back (i, std::move ( priors[i]) );
171+ m_Modes.emplace_back (i, priors[i]);
173172 }
174173 }
175174
@@ -426,12 +425,12 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
426425 for (const auto & mode : m_Modes) {
427426 TUnivariatePriorPtrDoublePr prior (mode.s_Prior ->univariate (marginalize, condition));
428427 if (prior.first == nullptr ) {
429- return {} ;
428+ return TUnivariatePriorPtrDoublePr () ;
430429 }
431430 if (prior.first ->isNonInformative ()) {
432431 continue ;
433432 }
434- modes.push_back (std::move ( prior.first ) );
433+ modes.push_back (prior.first );
435434 weights.push_back (prior.second );
436435 maxWeight.add (weights.back ());
437436 }
@@ -445,8 +444,8 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
445444 modes[i]->numberSamples (weights[i] / Z * modes[i]->numberSamples ());
446445 }
447446
448- return {boost::make_unique< CMultimodalPrior> (this ->dataType (),
449- this ->decayRate (), modes),
447+ return {TUnivariatePriorPtr ( new CMultimodalPrior (this ->dataType (),
448+ this ->decayRate (), modes) ),
450449 Z > 0.0 ? maxWeight[0 ] + std::log (Z) : 0.0 };
451450 }
452451
@@ -466,7 +465,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
466465 const TSizeDoublePr10Vec& condition) const {
467466
468467 if (N == 2 ) {
469- return { TPriorPtr (this ->clone ()), 0.0 } ;
468+ return TPriorPtrDoublePr ( TPriorPtr (this ->clone ()), 0.0 ) ;
470469 }
471470
472471 std::size_t n = m_Modes.size ();
@@ -485,7 +484,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
485484 if (prior.first ->isNonInformative ()) {
486485 continue ;
487486 }
488- modes.push_back (std::move ( prior.first ) );
487+ modes.push_back (prior.first );
489488 weights.push_back (prior.second );
490489 maxWeight.add (weights.back ());
491490 }
@@ -499,7 +498,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
499498 modes[i]->numberSamples (weights[i] / Z * modes[i]->numberSamples ());
500499 }
501500
502- return {boost::make_unique< CMultivariateMultimodalPrior<2 >> (this ->dataType (), modes),
501+ return {TPriorPtr ( new CMultivariateMultimodalPrior<2 >(this ->dataType (), modes) ),
503502 Z > 0.0 ? maxWeight[0 ] + std::log (Z) : 0.0 };
504503 }
505504
@@ -906,7 +905,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
906905
907906 // Create the child modes.
908907 LOG_TRACE (<< " Creating mode with index " << leftSplitIndex);
909- modes.emplace_back (leftSplitIndex, TPriorPtr ( m_Prior->m_SeedPrior -> clone ()) );
908+ modes.emplace_back (leftSplitIndex, m_Prior->m_SeedPrior );
910909 {
911910 TPointVec samples;
912911 if (!m_Prior->m_Clusterer ->sample (
@@ -936,7 +935,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
936935 }
937936
938937 LOG_TRACE (<< " Creating mode with index " << rightSplitIndex);
939- modes.emplace_back (rightSplitIndex, TPriorPtr ( m_Prior->m_SeedPrior -> clone ()) );
938+ modes.emplace_back (rightSplitIndex, m_Prior->m_SeedPrior );
940939 {
941940 TPointVec samples;
942941 if (!m_Prior->m_Clusterer ->sample (
@@ -1026,7 +1025,7 @@ class CMultivariateMultimodalPrior : public CMultivariatePrior {
10261025 MODE_TAG, TMode mode,
10271026 traverser.traverseSubLevel (boost::bind (
10281027 &TMode::acceptRestoreTraverser, &mode, boost::cref (params), _1)),
1029- m_Modes.push_back (std::move ( mode) ))
1028+ m_Modes.push_back (mode))
10301029 RESTORE_SETUP_TEARDOWN (
10311030 NUMBER_SAMPLES_TAG, double numberSamples,
10321031 core::CStringUtils::stringToType (traverser.value (), numberSamples),
0 commit comments