def test_Jacobian(self): for n in range(1, 20): v1 = np.random.rand() * 4 - 2 v2 = np.random.rand() * 4 - 2 o = TestObject2(v1, v2) o.adder.set_dofs(np.random.rand(2) * 4 - 2) o.t.set_dofs([np.random.rand() * 4 - 2]) o.t.adder1.set_dofs(np.random.rand(3) * 4 - 2) o.t.adder2.set_dofs(np.random.rand(2) * 4 - 2) r = Rosenbrock(b=3.0) r.set_dofs(np.random.rand(2) * 3 - 1.5) a = Affine(nparams=3, nvals=3) # Randomly fix some of the degrees of freedom o.fixed = np.random.rand(2) > 0.5 o.adder.fixed = np.random.rand(2) > 0.5 o.t.adder1.fixed = np.random.rand(3) > 0.5 o.t.adder2.fixed = np.random.rand(2) > 0.5 r.fixed = np.random.rand(2) > 0.5 a.fixed = np.random.rand(3) > 0.5 rtol = 1e-6 atol = 1e-6 for j in range(4): # Try different sets of the objects: if j == 0: dofs = Dofs([o.J, r.terms, o.t.J]) nvals = 4 nvals_per_func = [1, 2, 1] elif j == 1: dofs = Dofs([r.term2, r.terms]) nvals = 3 nvals_per_func = [1, 2] elif j == 2: dofs = Dofs( [r.term2, Target(o.t, 'f'), r.term1, Target(o, 'f')]) nvals = 4 nvals_per_func = [1, 1, 1, 1] elif j == 3: dofs = Dofs([a, o]) nvals = 4 nvals_per_func = [3, 1] jac = dofs.jac() dofs.diff_method = "forward" fd_jac = dofs.fd_jac() dofs.diff_method = "centered" fd_jac_centered = dofs.fd_jac() #print('j=', j, ' Diff in Jacobians:', jac - fd_jac) #print('jac: ', jac) #print('fd_jac: ', fd_jac) #print('fd_jac_centered: ', fd_jac_centered) #print('shapes: jac=', jac.shape, ' fd_jac=', fd_jac.shape, ' fd_jac_centered=', fd_jac_centered.shape) np.testing.assert_allclose(jac, fd_jac, rtol=rtol, atol=atol) np.testing.assert_allclose(fd_jac, fd_jac_centered, rtol=rtol, atol=atol) self.assertEqual(dofs.nvals, nvals) self.assertEqual(list(dofs.nvals_per_func), nvals_per_func)
def test_fd_jac(self): """ Test the parallel finite-difference Jacobian calculation. """ abs_step = 1.0e-7 rel_step = 0 for ngroups in range(1, 4): logger.debug('ngroups={}'.format(ngroups)) mpi = MpiPartition(ngroups=ngroups) o = TestFunction1() d = Dofs([o], diff_method="forward", abs_step=abs_step, rel_step=rel_step) logger.debug('About to do worker loop 1') jac, xs, evals = fd_jac_mpi(d, mpi) jac_reference = np.array([[5.865176283537110e-01, -6.010834349701177e-01, 2.250910244305793e-01]]) if mpi.proc0_world: np.testing.assert_allclose(jac, jac_reference, rtol=1e-13, atol=1e-13) # While we're at it, also test the serial FD Jacobian: o.set_dofs(np.array([1.2, 0.9, -0.4])) jac = d.fd_jac() np.testing.assert_allclose(jac, jac_reference, rtol=1e-13, atol=1e-13) # Repeat with centered differences o.set_dofs(np.array([1.2, 0.9, -0.4])) logger.debug('About to do worker loop 2') d.diff_method = "centered" jac, xs, evals = fd_jac_mpi(d, mpi) jac_reference = np.array([[5.865175337071982e-01, -6.010834789627051e-01, 2.250910093037906e-01]]) if mpi.proc0_world: np.testing.assert_allclose(jac, jac_reference, rtol=1e-13, atol=1e-13) # While we're at it, also test the serial FD Jacobian: o.set_dofs(np.array([1.2, 0.9, -0.4])) jac = d.fd_jac() np.testing.assert_allclose(jac, jac_reference, rtol=1e-13, atol=1e-13) # Now try a case with different nparams and nfuncs. o = TestFunction2() d = Dofs([o.f0, o.f1, o.f2, o.f3], diff_method="forward", abs_step=abs_step, rel_step=rel_step) logger.debug('About to do worker loop 3') jac, xs, evals = fd_jac_mpi(d, mpi) jac_reference = np.array([[8.657715439008840e-01, -8.872724499564555e-01], [2.353411054922816e+00, -2.411856577788640e+00], [6.397234502131255e+00, -6.556105911492693e+00], [1.738948636642590e+01, -1.782134355643450e+01]]) if mpi.proc0_world: np.testing.assert_allclose(jac, jac_reference, rtol=1e-13, atol=1e-13) # While we're at it, also test the serial FD Jacobian: o.set_dofs(np.array([1.2, 0.9])) jac = d.fd_jac() np.testing.assert_allclose(jac, jac_reference, rtol=1e-13, atol=1e-13) # Repeat with centered differences o.set_dofs(np.array([1.2, 0.9])) d.diff_method = "centered" logger.debug('About to do worker loop 4') jac, xs, evals = fd_jac_mpi(d, mpi) jac_reference = np.array([[8.657714037352271e-01, -8.872725151820582e-01], [2.353410674116319e+00, -2.411856754314101e+00], [6.397233469623842e+00, -6.556106388888594e+00], [1.738948351093228e+01, -1.782134486205678e+01]]) if mpi.proc0_world: np.testing.assert_allclose(jac, jac_reference, rtol=1e-13, atol=1e-13) # While we're at it, also test the serial FD Jacobian: o.set_dofs(np.array([1.2, 0.9])) jac = d.fd_jac() np.testing.assert_allclose(jac, jac_reference, rtol=1e-13, atol=1e-13)