def testAnomalyProbabilityResultsDuringProbationaryPeriod(self):
        originalUpdateAnomalyLikelihoods = an.updateAnomalyLikelihoods

        def updateAnomalyLikelihoodsWrap(anomalyScores, params, verbosity=0):
            likelihoods, avgRecordList, params = originalUpdateAnomalyLikelihoods(
                anomalyScores=anomalyScores,
                params=params,
                verbosity=verbosity)

            self.assertEqual(len(likelihoods), 1)

            return [0.1], avgRecordList, params

        updateAnomalyLikelihoodsPatch = mock.patch(
            "htm.algorithms.anomaly_likelihood.updateAnomalyLikelihoods",
            side_effect=updateAnomalyLikelihoodsWrap,
            autospec=True)
        with updateAnomalyLikelihoodsPatch:
            l = an.AnomalyLikelihood(learningPeriod=2,
                                     estimationSamples=2,
                                     historicWindowSize=3)

            # 0.5 result is expected during burn-in
            self.assertEqual(l.anomalyProbability(10, 0.1, timestamp=1), 0.5)
            self.assertEqual(l.anomalyProbability(10, 0.1, timestamp=2), 0.5)
            self.assertEqual(l.anomalyProbability(10, 0.1, timestamp=3), 0.5)
            self.assertEqual(l.anomalyProbability(10, 0.1, timestamp=4), 0.5)

            self.assertEqual(l.anomalyProbability(10, 0.1, timestamp=5), 0.9)
            self.assertEqual(l.anomalyProbability(10, 0.1, timestamp=6), 0.9)
    def testReestimationPeriodArg(self):
        estimateAnomalyLikelihoodsWrap = mock.Mock(
            wraps=an.estimateAnomalyLikelihoods, autospec=True)

        estimateAnomalyLikelihoodsPatch = mock.patch(
            "htm.algorithms.anomaly_likelihood.estimateAnomalyLikelihoods",
            side_effect=estimateAnomalyLikelihoodsWrap,
            autospec=True)
        with estimateAnomalyLikelihoodsPatch:
            l = an.AnomalyLikelihood(learningPeriod=2,
                                     estimationSamples=2,
                                     historicWindowSize=3,
                                     reestimationPeriod=2)

            # burn-in
            l.anomalyProbability(10, 0.1, timestamp=1)
            l.anomalyProbability(10, 0.1, timestamp=2)
            l.anomalyProbability(10, 0.1, timestamp=3)
            l.anomalyProbability(10, 0.1, timestamp=4)
            self.assertEqual(estimateAnomalyLikelihoodsWrap.call_count, 0)

            l.anomalyProbability(10, 0.1, timestamp=5)
            self.assertEqual(estimateAnomalyLikelihoodsWrap.call_count, 1)
            l.anomalyProbability(10, 0.1, timestamp=6)
            self.assertEqual(estimateAnomalyLikelihoodsWrap.call_count, 1)
            l.anomalyProbability(10, 0.1, timestamp=7)
            self.assertEqual(estimateAnomalyLikelihoodsWrap.call_count, 2)
            l.anomalyProbability(10, 0.1, timestamp=8)
            self.assertEqual(estimateAnomalyLikelihoodsWrap.call_count, 2)
    def testSerialization(self):
        """serialization using pickle"""
        l = an.AnomalyLikelihood(learningPeriod=2, estimationSamples=2)

        l.anomalyProbability("hi", 0.1, timestamp=1)  # burn in
        l.anomalyProbability("hi", 0.1, timestamp=2)
        l.anomalyProbability("hello", 0.3, timestamp=3)

        stored = pickle.dumps(l)
        restored = pickle.loads(stored)

        self.assertEqual(l, restored)
    def testdWindowSizeImpactOnEstimateAnomalyLikelihoodsArgs(self):

        # Verify that AnomalyLikelihood's historicWindowSize plays nice with args
        # passed to estimateAnomalyLikelihoods"""

        originalEstimateAnomalyLikelihoods = an.estimateAnomalyLikelihoods

        estimationArgs = []

        def estimateAnomalyLikelihoodsWrap(anomalyScores,
                                           averagingWindow=10,
                                           skipRecords=0,
                                           verbosity=0):
            estimationArgs.append((tuple(anomalyScores), skipRecords))

            return originalEstimateAnomalyLikelihoods(
                anomalyScores,
                averagingWindow=averagingWindow,
                skipRecords=skipRecords,
                verbosity=verbosity)

        estimateAnomalyLikelihoodsPatch = mock.patch(
            "htm.algorithms.anomaly_likelihood.estimateAnomalyLikelihoods",
            side_effect=estimateAnomalyLikelihoodsWrap,
            autospec=True)
        with estimateAnomalyLikelihoodsPatch as estimateAnomalyLikelihoodsMock:
            l = an.AnomalyLikelihood(learningPeriod=2,
                                     estimationSamples=2,
                                     historicWindowSize=3)

            l.anomalyProbability(10, 0.1, timestamp=1)
            self.assertEqual(estimateAnomalyLikelihoodsMock.call_count, 0)

            l.anomalyProbability(20, 0.2, timestamp=2)
            self.assertEqual(estimateAnomalyLikelihoodsMock.call_count, 0)

            l.anomalyProbability(30, 0.3, timestamp=3)
            self.assertEqual(estimateAnomalyLikelihoodsMock.call_count, 0)

            l.anomalyProbability(40, 0.4, timestamp=4)
            self.assertEqual(estimateAnomalyLikelihoodsMock.call_count, 0)

            # Estimation should kick in after learningPeriod + estimationSamples
            # samples have been ingested
            l.anomalyProbability(50, 0.5, timestamp=5)
            self.assertEqual(estimateAnomalyLikelihoodsMock.call_count, 1)
            # NOTE: we cannot use mock's assert_called_with, because the sliding
            # window container changes in-place after estimateAnomalyLikelihoods is
            # called
            scores, numSkip = estimationArgs.pop()
            self.assertEqual(scores,
                             ((2, 20, 0.2), (3, 30, 0.3), (4, 40, 0.4)))
            self.assertEqual(numSkip, 1)
    def testEquals(self):
        l = an.AnomalyLikelihood(learningPeriod=2, estimationSamples=2)
        l2 = an.AnomalyLikelihood(learningPeriod=2, estimationSamples=2)
        self.assertEqual(l, l2)

        # Use 5 iterations to force the distribution to be created (4 probationary
        # samples + 1)
        l2.anomalyProbability(5, 0.1, timestamp=1)  # burn in
        l2.anomalyProbability(5, 0.1, timestamp=2)
        l2.anomalyProbability(5, 0.1, timestamp=3)
        l2.anomalyProbability(5, 0.1, timestamp=4)
        self.assertIsNone(l2._distribution)
        l2.anomalyProbability(1, 0.3, timestamp=5)
        self.assertIsNotNone(l2._distribution)
        self.assertNotEqual(l, l2)

        l.anomalyProbability(5, 0.1, timestamp=1)  # burn in
        l.anomalyProbability(5, 0.1, timestamp=2)
        l.anomalyProbability(5, 0.1, timestamp=3)
        l.anomalyProbability(5, 0.1, timestamp=4)
        self.assertIsNone(l._distribution)
        l.anomalyProbability(1, 0.3, timestamp=5)
        self.assertIsNotNone(l._distribution)
        self.assertEqual(l, l2, "equal? \n%s\n vs. \n%s" % (l, l2))
    def testHistoricWindowSize(self):
        l = an.AnomalyLikelihood(learningPeriod=2,
                                 estimationSamples=2,
                                 historicWindowSize=3)

        l.anomalyProbability(5, 0.1, timestamp=1)  # burn in
        self.assertEqual(len(l._historicalScores), 1)

        l.anomalyProbability(5, 0.1, timestamp=2)
        self.assertEqual(len(l._historicalScores), 2)

        l.anomalyProbability(5, 0.1, timestamp=3)
        self.assertEqual(len(l._historicalScores), 3)

        l.anomalyProbability(5, 0.1, timestamp=4)
        self.assertEqual(len(l._historicalScores), 3)