Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/CHANGELOG.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
=== Bug Fixes

* Correct inference model definition for MSLE regression models. (See {ml-pull}1375[#1375].)
* Fix restoration of change detectors after seasonality change. (See {ml-pull}1391[#1391].)

== {es} version 7.8.1

Expand Down
8 changes: 6 additions & 2 deletions include/maths/CTimeSeriesChangeDetector.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,9 @@ class MATHS_EXPORT CUnivariateTimeSeriesChangeDetector {
using TMinMaxAccumulator = CBasicStatistics::CMinMax<core_t::TTime>;
using TRegression = CLeastSquaresOnlineRegression<1, double>;

//! Initialise the m_ChangeModels vector
void initChangeModels(TPriorPtr residualModel);

private:
//! The minimum amount of time we need to observe before
//! selecting a change model.
Expand Down Expand Up @@ -227,6 +230,9 @@ class MATHS_EXPORT CUnivariateChangeModel {
//! Get a checksum for this object.
virtual uint64_t checksum(uint64_t seed) const = 0;

//! Get the time series residual model member variable.
const TPriorPtr& residualModelPtr() const;

protected:
CUnivariateChangeModel(const CUnivariateChangeModel& other,
const TDecompositionPtr& trendModel,
Expand Down Expand Up @@ -257,8 +263,6 @@ class MATHS_EXPORT CUnivariateChangeModel {
const CPrior& residualModel() const;
//! Get the time series residual model.
CPrior& residualModel();
//! Get the time series residual model member variable.
const TPriorPtr& residualModelPtr() const;

private:
using TMeanVarAccumulator = CBasicStatistics::SSampleMeanVar<double>::TAccumulator;
Expand Down
20 changes: 14 additions & 6 deletions lib/maths/CTimeSeriesChangeDetector.cc
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,16 @@ CUnivariateTimeSeriesChangeDetector::CUnivariateTimeSeriesChangeDetector(
: m_MinimumTimeToDetect{minimumTimeToDetect}, m_MaximumTimeToDetect{maximumTimeToDetect},
m_MinimumDeltaBicToDetect{minimumDeltaBicToDetect}, m_SampleCount{0},
m_DecisionFunction{0.0}, m_TrendModel{trendModel->clone()} {
this->initChangeModels(residualModel);
}

void CUnivariateTimeSeriesChangeDetector::initChangeModels(TPriorPtr residualModel) {
m_ChangeModels.clear();
m_ChangeModels.push_back(
std::make_unique<CUnivariateNoChangeModel>(trendModel, residualModel));
std::make_unique<CUnivariateNoChangeModel>(m_TrendModel, residualModel));
m_ChangeModels.push_back(
std::make_unique<CUnivariateLevelShiftModel>(m_TrendModel, residualModel));
if (trendModel->seasonalComponents().size() > 0) {
if (m_TrendModel->seasonalComponents().size() > 0) {
m_ChangeModels.push_back(std::make_unique<CUnivariateTimeShiftModel>(
m_TrendModel, residualModel, -core::constants::HOUR));
m_ChangeModels.push_back(std::make_unique<CUnivariateTimeShiftModel>(
Expand Down Expand Up @@ -146,10 +151,13 @@ bool CUnivariateTimeSeriesChangeDetector::acceptRestoreTraverser(
RESTORE_SETUP_TEARDOWN(MAX_TIME_TAG, core_t::TTime time,
core::CStringUtils::stringToType(traverser.value(), time),
m_TimeRange.add(time))
RESTORE(TREND_MODEL_TAG, traverser.traverseSubLevel(std::bind<bool>(
CTimeSeriesDecompositionStateSerialiser(),
std::cref(params.s_DecompositionParams),
std::ref(m_TrendModel), std::placeholders::_1)))
RESTORE_SETUP_TEARDOWN(TREND_MODEL_TAG, /**/,
traverser.traverseSubLevel(std::bind<bool>(
CTimeSeriesDecompositionStateSerialiser(),
std::cref(params.s_DecompositionParams),
std::ref(m_TrendModel), std::placeholders::_1)),
this->initChangeModels((*model)->residualModelPtr());
model = m_ChangeModels.begin())
RESTORE_SETUP_TEARDOWN(
CHANGE_MODEL_TAG, TChangeModelPtr restoredModel{(*model)->clone(m_TrendModel)},
traverser.traverseSubLevel(std::bind(
Expand Down