def test_unfix_all(self):
        # Test with leaf nodes
        adder = Adder(n=3,
                      x0=[1, 2, 3],
                      dof_names=['x', 'y', 'z'],
                      dof_fixed=[True, False, False])
        iden = Identity(x=10, dof_fixed=True)
        adder_x = adder.x
        iden_x = iden.x
        self.assertEqual(len(adder_x), 2)
        self.assertEqual(adder.dof_size, 2)
        self.assertAlmostEqual(adder_x[0], 2)
        self.assertAlmostEqual(adder_x[1], 3)
        self.assertEqual(len(iden_x), 0)

        with self.assertRaises(ValueError):
            iden.x = [10]
        with self.assertRaises(ValueError):
            adder.x = [4, 5, 6]

        iden.unfix_all()
        adder.unfix_all()
        iden.x = [10]
        adder.x = [4, 5, 6]
        self.assertEqual(iden.dof_size, 1)
        self.assertEqual(adder.dof_size, 3)
        self.assertAlmostEqual(adder._dofs.loc['x', '_x'], 4)
        self.assertAlmostEqual(adder._dofs.loc['y', '_x'], 5)
        self.assertAlmostEqual(adder._dofs.loc['z', '_x'], 6)
        self.assertAlmostEqual(iden._dofs.loc['x0', '_x'], 10)

        # Check with Optimizable objects containing parents
        adder = Adder(n=3,
                      x0=[1, 2, 3],
                      dof_names=['x', 'y', 'z'],
                      dof_fixed=[True, False, False])
        iden = Identity(x=10, dof_fixed=True)
        test_obj = OptClassWithParents(10, opts_in=[iden, adder])

        with self.assertRaises(ValueError):
            test_obj.x = np.array([20, 4, 5, 6, 25])

        adder.unfix_all()
        test_obj.x = np.array([4, 5, 6, 25])
        self.assertAlmostEqual(test_obj._dofs.loc['val', '_x'], 25)
        self.assertAlmostEqual(adder._dofs.loc['x', '_x'], 4)
        self.assertAlmostEqual(adder._dofs.loc['y', '_x'], 5)
        self.assertAlmostEqual(adder._dofs.loc['z', '_x'], 6)

        iden.unfix_all()
        test_obj.x = np.array([1, 1, 2, 3, 10])

        self.assertAlmostEqual(iden._dofs.loc['x0', '_x'], 1)
        self.assertAlmostEqual(adder._dofs.loc['x', '_x'], 1)
        self.assertAlmostEqual(adder._dofs.loc['y', '_x'], 2)
        self.assertAlmostEqual(adder._dofs.loc['z', '_x'], 3)
        self.assertAlmostEqual(test_obj._dofs.loc['val', '_x'], 10)
 def test_parent_dof_transitive_behavior(self):
     iden1 = Identity()
     iden2 = Identity()
     lsp = LeastSquaresProblem.from_sigma([3, -4], [2, 5], opts_in=[iden1, iden2])
     iden1.x = [10]
     self.assertAlmostEqual(np.abs(lsp.residuals()[0]), 3.5)
     self.assertAlmostEqual(np.abs(lsp.residuals()[1]), 0.8)
 def test_least_squares_combination(self):
     iden1 = Identity()
     iden2 = Identity()
     term1 = LeastSquaresProblem.from_sigma(3, 2, opts_in=[iden1])
     term2 = LeastSquaresProblem.from_sigma(-4, 5, opts_in=[iden2])
     lsp = term1 + term2
     iden1.x = [10]
     self.assertAlmostEqual(np.abs(lsp.residuals()[0]), 3.5)
     self.assertAlmostEqual(np.abs(lsp.residuals()[1]), 0.8)
    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_x(self):
        # Check with leaf type Optimizable objects
        adder = Adder(n=3, x0=[1, 2, 3], dof_names=['x', 'y', 'z'])
        iden = Identity(x=10, dof_fixed=True)
        adder_dofs = adder.x
        iden_dofs = iden.x
        self.assertAlmostEqual(adder_dofs[0], 1)
        self.assertAlmostEqual(adder_dofs[1], 2)
        self.assertAlmostEqual(adder_dofs[2], 3)
        self.assertEqual(len(iden_dofs), 0)

        adder.x = [4, 5, 6]
        self.assertAlmostEqual(adder._dofs.loc['x', '_x'], 4)
        self.assertAlmostEqual(adder._dofs.loc['y', '_x'], 5)
        self.assertAlmostEqual(adder._dofs.loc['z', '_x'], 6)
        with self.assertRaises(ValueError):
            iden.x = np.array([
                11,
            ], dtype=float)
        self.assertAlmostEqual(iden.full_x[0], 10)

        # Check with Optimizable objects containing parents
        adder2 = Adder(3)
        iden2 = Identity(x=10)
        test_obj1 = OptClassWithParents(10, opts_in=[iden2, adder2])
        with self.assertRaises(ValueError):
            test_obj1.x = np.array([20])

        test_obj1.x = np.array([20, 4, 5, 6, 25])
        self.assertAlmostEqual(test_obj1._dofs.loc['val', '_x'], 25)
        self.assertAlmostEqual(iden2._dofs.loc['x0', '_x'], 20)
        self.assertAlmostEqual(adder2._dofs.loc['x0', '_x'], 4)
        self.assertAlmostEqual(adder2._dofs.loc['x1', '_x'], 5)
        self.assertAlmostEqual(adder2._dofs.loc['x2', '_x'], 6)

        adder3 = Adder(3)
        test_obj2 = OptClassWithParents(10, opts_in=[iden, adder3])
        with self.assertRaises(ValueError):
            test_obj2.x = np.array([20, 4, 5, 6, 25])

        test_obj2.x = np.array([4, 5, 6, 25])
        self.assertAlmostEqual(iden._dofs.loc['x0', '_x'], 10)
        self.assertAlmostEqual(adder3._dofs.loc['x0', '_x'], 4)
        self.assertAlmostEqual(adder3._dofs.loc['x1', '_x'], 5)
        self.assertAlmostEqual(adder3._dofs.loc['x2', '_x'], 6)
        self.assertAlmostEqual(test_obj2._dofs.loc['val', '_x'], 25)
    def test_call(self):
        # Test for leaf nodes
        adder = Adder(n=3,
                      x0=[1, 2, 3],
                      dof_names=['x', 'y', 'z'],
                      dof_fixed=[True, False, False])
        self.assertAlmostEqual(adder(), 6.0)
        adder.fix('y')
        self.assertAlmostEqual(adder(), 6.0)

        iden = Identity(x=10, dof_fixed=True)
        self.assertAlmostEqual(iden(), 10.0)

        # Set dofs and call
        adder.x = [6]
        self.assertAlmostEqual(adder(), 9.0)
        adder.unfix_all()
        adder.x = [4, 5, 6]
        self.assertAlmostEqual(adder(), 15.0)
        iden.unfix_all()
        iden.x = [20]
        self.assertAlmostEqual(iden(), 20.0)

        # Call with arguments
        self.assertAlmostEqual(adder(x=[10, 11, 12]), 33)
        self.assertAlmostEqual(iden(x=[20]), 20)

        # Now call without arguments to make sure the previous value is returned
        self.assertAlmostEqual(adder(), 33)
        self.assertAlmostEqual(iden(), 20)

        # Fix dofs and now call
        adder.fix('x')
        self.assertAlmostEqual(adder([1, 2]), 13)
        adder.fix_all()
        self.assertAlmostEqual(adder(), 13)
        iden.fix_all()
        self.assertAlmostEqual(iden(), 20)

        # Check with Optimizable objects containing parents
        adder = Adder(n=3,
                      x0=[1, 2, 3],
                      dof_names=['x', 'y', 'z'],
                      dof_fixed=[True, False, False])
        iden = Identity(x=10, dof_fixed=True)
        test_obj1 = OptClassWithParents(20, opts_in=[iden, adder])
        # Value returned by test_obj1 is (val + 2*iden())/(10.0 + adder())
        self.assertAlmostEqual(test_obj1(), 2.5)

        # Set the parents nodes' x and call
        adder.x = [4, 5]
        self.assertAlmostEqual(test_obj1(), 2.0)

        # Set the dofs and call
        test_obj1.x = np.array([14, 15, 30])
        self.assertAlmostEqual(test_obj1(), 1.25)

        # Set only the node  local dofs and call
        test_obj1.local_x = [20]
        self.assertAlmostEqual(test_obj1(), 1.0)

        # Call with arguments
        self.assertAlmostEqual(test_obj1([2, 3, 20]), 2.5)
        # Followed by Call with no arguments
        self.assertAlmostEqual(test_obj1(), 2.5)