def testModelSaveAndLoad(self):
        # Keywords model uses the base class implementations of save/load methods.
        self.modelDir = "poke_model"
        model = ClassificationModelKeywords(modelDir=self.modelDir,
                                            verbosity=0)

        samples = {
            0: (["Pickachu"], numpy.array([0, 2, 2])),
            1: (["Eevee"], numpy.array([2])),
            2: (["Charmander"], numpy.array([0, 1, 1])),
            3: (["Abra"], numpy.array([1])),
            4: (["Squirtle"], numpy.array([1, 0, 1]))
        }

        patterns = model.encodeSamples(samples)
        for i in xrange(len(samples)):
            model.trainModel(i)

        output = [model.testModel(i) for i in xrange(len(patterns))]

        model.saveModel()

        loadedModel = ClassificationModel(verbosity=0).loadModel(self.modelDir)
        loadedModelOutput = [
            loadedModel.testModel(i) for i in xrange(len(patterns))
        ]

        for mClasses, lClasses in zip(output, loadedModelOutput):
            self.assertSequenceEqual(
                mClasses.tolist(), lClasses.tolist(), "Output "
                "classifcations from loaded model don't match original model's."
            )
  def testModelSaveAndLoad(self):
    # Keywords model uses the base class implementations of save/load methods.
    self.modelDir = "poke_model"
    model = ClassificationModelKeywords(modelDir=self.modelDir, verbosity=0)
    
    samples = {0: (["Pickachu"], numpy.array([0, 2, 2])),
               1: (["Eevee"], numpy.array([2])),
               2: (["Charmander"], numpy.array([0, 1, 1])),
               3: (["Abra"], numpy.array([1])),
               4: (["Squirtle"], numpy.array([1, 0, 1]))}

    patterns = model.encodeSamples(samples)
    for i in xrange(len(samples)):
      model.trainModel(i)

    output = [model.testModel(i) for i in xrange(len(patterns))]

    model.saveModel()

    loadedModel = ClassificationModel(verbosity=0).loadModel(self.modelDir)
    loadedModelOutput = [loadedModel.testModel(i)
                         for i in xrange(len(patterns))]
    
    for mClasses, lClasses in zip(output, loadedModelOutput):
      self.assertSequenceEqual(mClasses.tolist(), lClasses.tolist(), "Output "
          "classifcations from loaded model don't match original model's.")
  def testNoWinningLabels(self):
    """Inferring 0/4 classes should return 0 winning labels."""
    model = ClassificationModel()

    inferenceResult = numpy.array([0, 0, 0, 0])
    topLabels = model.getWinningLabels(inferenceResult)

    self.assertFalse(topLabels)
    def testNoWinningLabels(self):
        """Inferring 0/4 classes should return 0 winning labels."""
        model = ClassificationModel()

        inferenceResult = numpy.array([0, 0, 0, 0])
        topLabels = model.getWinningLabels(inferenceResult)

        self.assertFalse(topLabels)
    def testCalculateAccuracyMultipleSamples(self):
        """
    Tests testCalculateAccuracy() method of classification model base class for
    three test samples.
    """
        model = ClassificationModel()

        actualLabels = [numpy.array([0]), numpy.array([0, 2]), numpy.array([0, 1, 2])]
        predictedLabels = [numpy.array([0]), [None], numpy.array([1, 2, 0])]
        classifications = [predictedLabels, actualLabels]

        self.assertAlmostEqual(model.calculateAccuracy(classifications), float(2) / 3)
    def testCalculateAccuracyMultipleSamples(self):
        """
    Tests testCalculateAccuracy() method of classification model base class for
    three test samples.
    """
        model = ClassificationModel()

        actualLabels = [
            numpy.array([0]),
            numpy.array([0, 2]),
            numpy.array([0, 1, 2])
        ]
        predictedLabels = [numpy.array([0]), [None], numpy.array([1, 2, 0])]
        classifications = [predictedLabels, actualLabels]

        self.assertAlmostEqual(model.calculateAccuracy(classifications),
                               float(2) / 3)
    def testCalculateAccuracyMixedSamples(self):
        """
    Tests testCalculateAccuracy() method of classification model base class for
    test samples with mixed classifications.
    """
        model = ClassificationModel()

        actualLabels = [numpy.array([0, 1, 2])]
        predictedLabels1 = [numpy.array([1, 2, 0])]
        predictedLabels2 = [numpy.array([1])]
        predictedLabels3 = [None]
        classifications1 = [predictedLabels1, actualLabels]
        classifications2 = [predictedLabels2, actualLabels]
        classifications3 = [predictedLabels3, actualLabels]

        self.assertAlmostEqual(model.calculateAccuracy(classifications1), 1.0)
        self.assertAlmostEqual(model.calculateAccuracy(classifications2), float(1) / 3)
        self.assertAlmostEqual(model.calculateAccuracy(classifications3), 0.0)
    def testCalculateAccuracyMixedSamples(self):
        """
    Tests testCalculateAccuracy() method of classification model base class for
    test samples with mixed classifications.
    """
        model = ClassificationModel()

        actualLabels = [numpy.array([0, 1, 2])]
        predictedLabels1 = [numpy.array([1, 2, 0])]
        predictedLabels2 = [numpy.array([1])]
        predictedLabels3 = [None]
        classifications1 = [predictedLabels1, actualLabels]
        classifications2 = [predictedLabels2, actualLabels]
        classifications3 = [predictedLabels3, actualLabels]

        self.assertAlmostEqual(model.calculateAccuracy(classifications1), 1.0)
        self.assertAlmostEqual(model.calculateAccuracy(classifications2),
                               float(1) / 3)
        self.assertAlmostEqual(model.calculateAccuracy(classifications3), 0.0)
  def testWinningLabels(self):
    """
    Tests whether classification base class returns multiple labels correctly.
    """
    model = ClassificationModel()
    inferenceResult = numpy.array([3, 1, 4, 0, 1, 0])

    topLabels = model.getWinningLabels(inferenceResult, numLabels=1)
    self.assertTrue(numpy.allclose(topLabels, numpy.array([2])),
                    "Output should be label 2.")

    topLabels = model.getWinningLabels(inferenceResult, numLabels=2)
    self.assertTrue(numpy.allclose(topLabels, numpy.array([2, 0])),
                    "Output should be labels 2 and 0.")

    # Test only nonzero labels are returned.
    inferenceResult = numpy.array([3, 0, 4, 0, 0, 0])
    topLabels = model.getWinningLabels(inferenceResult, numLabels=5)
    self.assertTrue(numpy.allclose(topLabels, numpy.array([2, 0])),
                    "Output should be labels 2 and 0.")
    def testWinningLabels(self):
        """
    Tests whether classification base class returns multiple labels correctly.
    """
        model = ClassificationModel()
        inferenceResult = numpy.array([3, 1, 4, 0, 1, 0])

        topLabels = model.getWinningLabels(inferenceResult, numLabels=1)
        self.assertTrue(numpy.allclose(topLabels, numpy.array([2])),
                        "Output should be label 2.")

        topLabels = model.getWinningLabels(inferenceResult, numLabels=2)
        self.assertTrue(numpy.allclose(topLabels, numpy.array([2, 0])),
                        "Output should be labels 2 and 0.")

        # Test only nonzero labels are returned.
        inferenceResult = numpy.array([3, 0, 4, 0, 0, 0])
        topLabels = model.getWinningLabels(inferenceResult, numLabels=5)
        self.assertTrue(numpy.allclose(topLabels, numpy.array([2, 0])),
                        "Output should be labels 2 and 0.")
    def testWinningLabels(self):
        """
    Tests whether classification base class returns multiple labels correctly.
    """
        model = ClassificationModel()
        inferenceResult = numpy.array([3, 1, 4, 0, 1, 0])

        topLabels = model.getWinningLabels(inferenceResult, numLabels=1)
        self.assertTrue(numpy.allclose(topLabels, numpy.array([2])), "Output should be label 2.")

        topLabels = model.getWinningLabels(inferenceResult, numLabels=2)
        self.assertTrue(numpy.allclose(topLabels, numpy.array([2, 0])), "Output should be labels 2 and 0.")

        # Test tie is broken by the later index; label 4 beats out label 1.
        topLabels = model.getWinningLabels(inferenceResult, numLabels=3)
        self.assertTrue(numpy.allclose(topLabels, numpy.array([2, 0, 4])), "Output should be labels 2, 0, and 1.")

        # Test only nonzero labels are returned.
        topLabels = model.getWinningLabels(inferenceResult, numLabels=5)
        self.assertTrue(numpy.allclose(topLabels, numpy.array([2, 0, 4, 1])), "Output should be labels 2, 0, 1, and 4.")