def test_single_value_opt_in(self):
        iden = Identity()
        lst = LeastSquaresProblem.from_sigma(3, 0.1, opts_in=iden)

        iden.x = [17]
        correct_value = ((17 - 3) / 0.1)  # ** 2
        self.assertAlmostEqual(np.abs(lst.residuals()[0]),
                               correct_value,
                               places=11)

        iden.x = [0]
        term1 = LeastSquaresProblem.from_sigma(3, 2, opts_in=iden)
        self.assertAlmostEqual(np.abs(term1.residuals()[0]), 1.5)

        term1.x = [10]
        self.assertAlmostEqual(np.abs(term1.residuals()[0]), 3.5)
        self.assertAlmostEqual(np.abs(term1.residuals(x=[0])), 1.5)
        self.assertAlmostEqual(np.abs(term1.residuals(x=[5])), 1)
    def test_exceptions(self):
        """
        Test that exceptions are thrown when invalid inputs are
        provided.
        """
        iden = Identity()

        # sigma cannot be zero
        with self.assertRaises(ValueError):
            lst = LeastSquaresProblem.from_sigma(3, 0, opts_in=iden)

        # Weight cannot be negative
        with self.assertRaises(ValueError):
            lst = LeastSquaresProblem(3, -1.0, opts_in=iden)
 def test_multiple_funcs_single_input(self):
     iden1 = Identity(x=10)
     iden2 = Identity()
     # Objective function
     # f(x,y) = ((x - 3) / 2) ** 2 + ((y + 4) / 5) ** 2
     lsp = LeastSquaresProblem.from_sigma([3, -4], [2, 5], opts_in=[iden1, iden2])
     self.assertAlmostEqual(np.abs(lsp.residuals()[0]), 3.5)
     self.assertAlmostEqual(np.abs(lsp.residuals()[1]), 0.8)
     lsp.x = [5, -7]
     self.assertAlmostEqual(np.abs(lsp.residuals()[0]), 1.0)
     self.assertAlmostEqual(np.abs(lsp.residuals()[1]), 0.6)
     self.assertAlmostEqual(np.abs(lsp.residuals([10, 0])[0]), 3.5)
     self.assertAlmostEqual(np.abs(lsp.residuals([10, 0])[1]), 0.8)
     self.assertAlmostEqual(np.abs(lsp.residuals([5, -7])[0]), 1.0)
     self.assertAlmostEqual(np.abs(lsp.residuals([5, -7])[1]), 0.6)