def test01_add_rev(m): a, b = m.Float(1), m.Float(2) ek.enable_grad(a, b) c = 2 * a + b ek.backward(c) assert ek.grad(a) == 2 assert ek.grad(b) == 1
def test04_div(m): a, b = m.Float(2), m.Float(3) ek.enable_grad(a, b) d = a / b ek.backward(d) assert ek.allclose(ek.grad(a), 1.0 / 3.0) assert ek.allclose(ek.grad(b), -2.0 / 9.0)
def test17_cos(m): x = ek.linspace(m.Float, 0.01, 10, 10) ek.enable_grad(x) y = ek.cos(x) ek.backward(y) assert ek.allclose(ek.detach(y), ek.cos(ek.detach(x))) assert ek.allclose(ek.grad(x), -ek.sin(ek.detach(x)))
def test14_rsqrt(m): x = m.Float(1, .25, 0.0625) ek.enable_grad(x) y = ek.rsqrt(x) ek.backward(y) assert ek.allclose(ek.detach(y), [1, 2, 4]) assert ek.allclose(ek.grad(x), [-.5, -4, -32])
def test15_abs(m): x = m.Float(-2, 2) ek.enable_grad(x) y = ek.abs(x) ek.backward(y) assert ek.allclose(ek.detach(y), [2, 2]) assert ek.allclose(ek.grad(x), [-1, 1])
def test11_hmax_rev(m): x = m.Float(1, 2, 8, 5, 8) ek.enable_grad(x) y = ek.hmax_async(x) ek.backward(y) assert len(y) == 1 and ek.allclose(y[0], 8) assert ek.allclose(ek.grad(x), [0, 0, 1, 0, 1])
def test13_sqrt(m): x = m.Float(1, 4, 16) ek.enable_grad(x) y = ek.sqrt(x) ek.backward(y) assert ek.allclose(ek.detach(y), [1, 2, 4]) assert ek.allclose(ek.grad(x), [.5, .25, .125])
def test11_hprod(m): x = m.Float(1, 2, 5, 8) ek.enable_grad(x) y = ek.hprod_async(x) ek.backward(y) assert len(y) == 1 and ek.allclose(y[0], 80) assert ek.allclose(ek.grad(x), [80, 40, 16, 10])
def test14_differentiable_surface_interaction_ray_backward( variant_gpu_autodiff_rgb): from mitsuba.core import xml, Ray3f, Vector3f, UInt32 scene = xml.load_string(''' <scene version="2.0.0"> <shape type="obj" id="rect"> <string name="filename" value="resources/data/common/meshes/rectangle.obj"/> </shape> </scene> ''') ray = Ray3f(Vector3f(-0.3, -0.4, -10.0), Vector3f(0.0, 0.0, 1.0), 0, []) pi = scene.ray_intersect_preliminary(ray) ek.set_requires_gradient(ray.o) # If si.p is shifted along the x-axis, so does the ray origin si = pi.compute_surface_interaction(ray) ek.backward(si.p.x) assert ek.allclose(ek.gradient(ray.o), [1, 0, 0]) # If si.t is changed, so does the ray origin along the z-axis si = pi.compute_surface_interaction(ray) ek.backward(si.t) assert ek.allclose(ek.gradient(ray.o), [0, 0, -1])
def test05_hsum_0_rev(m): x = ek.linspace(m.Float, 0, 1, 10) ek.enable_grad(x) y = ek.hsum_async(x * x) ek.backward(y) assert len(y) == 1 and ek.allclose(y, 95.0 / 27.0) assert ek.allclose(ek.grad(x), 2 * ek.detach(x))
def test24_log(m): x = ek.linspace(m.Float, 0.01, 1, 10) ek.enable_grad(x) y = ek.log(x * x) ek.backward(y) log_x = ek.log(ek.sqr(ek.detach(x))) assert ek.allclose(y, log_x) assert ek.allclose(ek.grad(x), 2 / ek.detach(x))
def test23_exp(m): x = ek.linspace(m.Float, 0, 1, 10) ek.enable_grad(x) y = ek.exp(x * x) ek.backward(y) exp_x = ek.exp(ek.sqr(ek.detach(x))) assert ek.allclose(y, exp_x) assert ek.allclose(ek.grad(x), 2 * ek.detach(x) * exp_x)
def test18_gather(m): x = ek.linspace(m.Float, -1, 1, 10) ek.enable_grad(x) y = ek.gather(m.Float, x * x, m.UInt(1, 1, 2, 3)) z = ek.hsum_async(y) ek.backward(z) ref = [0, -1.55556 * 2, -1.11111, -0.666667, 0, 0, 0, 0, 0, 0] assert ek.allclose(ek.grad(x), ref)
def test09_hsum_2_rev(m): x = ek.linspace(m.Float, 0, 1, 11) ek.enable_grad(x) z = ek.hsum_async(ek.hsum_async(x * x) * x * x) ek.backward(z) assert ek.allclose( ek.grad(x), [0., 1.54, 3.08, 4.62, 6.16, 7.7, 9.24, 10.78, 12.32, 13.86, 15.4])
def test03_sub_mul(m): a, b, c = m.Float(2), m.Float(3), m.Float(4) ek.enable_grad(a, b, c) d = a * b - c ek.backward(d) assert ek.grad(a) == ek.detach(b) assert ek.grad(b) == ek.detach(a) assert ek.grad(c) == -1
def test_56_diffloop_simple_rev(m, no_record): fi, fo = m.Float(1, 2, 3), m.Float(0, 0, 0) ek.enable_grad(fi) loop = m.Loop("MyLoop", lambda: fo) while loop(fo < 10): fo += fi ek.backward(fo) assert ek.grad(fi) == m.Float(10, 5, 4)
def test31_atan(m): x = ek.linspace(m.Float, -.8, .8, 10) ek.enable_grad(x) y = ek.atan(x * x) ek.backward(y) atan_x = ek.atan(ek.sqr(ek.detach(x))) assert ek.allclose(y, atan_x) assert ek.allclose( ek.grad(x), m.Float(-1.13507, -1.08223, -0.855508, -0.53065, -0.177767, 0.177767, 0.53065, 0.855508, 1.08223, 1.13507))
def test25_pow(m): x = ek.linspace(m.Float, 1, 10, 10) y = ek.full(m.Float, 2.0, 10) ek.enable_grad(x, y) z = x**y ek.backward(z) assert ek.allclose(ek.grad(x), ek.detach(x) * 2) assert ek.allclose( ek.grad(y), m.Float(0., 2.77259, 9.88751, 22.1807, 40.2359, 64.5033, 95.3496, 133.084, 177.975, 230.259))
def test_58_diffloop_masking_rev(m, no_record): fo = ek.zero(m.Float, 10) fi = m.Float(1, 2) i = m.UInt32(0, 5) ek.enable_grad(fi) loop = m.Loop("MyLoop", lambda: i) while loop(i < 5): ek.scatter_reduce(ek.ReduceOp.Add, fo, fi, i) i += 1 ek.backward(fo) assert ek.grad(fi) == m.Float(5, 0)
def test30_acos(m): x = ek.linspace(m.Float, -.8, .8, 10) ek.enable_grad(x) y = ek.acos(x * x) ek.backward(y) acos_x = ek.acos(ek.sqr(ek.detach(x))) assert ek.allclose(y, acos_x) assert ek.allclose( ek.grad(x), m.Float(2.08232, 1.3497, 0.906755, 0.534687, 0.177783, -0.177783, -0.534687, -0.906755, -1.3497, -2.08232))
def test29_asin(m): x = ek.linspace(m.Float, -.8, .8, 10) ek.enable_grad(x) y = ek.asin(x * x) ek.backward(y) asin_x = ek.asin(ek.sqr(ek.detach(x))) assert ek.allclose(y, asin_x) assert ek.allclose( ek.grad(x), m.Float(-2.08232, -1.3497, -0.906755, -0.534687, -0.177783, 0.177783, 0.534687, 0.906755, 1.3497, 2.08232))
def test28_tan(m): x = ek.linspace(m.Float, 0, 1, 10) ek.enable_grad(x) y = ek.tan(x * x) ek.backward(y) tan_x = ek.tan(ek.sqr(ek.detach(x))) assert ek.allclose(y, tan_x) assert ek.allclose( ek.grad(x), m.Float(0., 0.222256, 0.44553, 0.674965, 0.924494, 1.22406, 1.63572, 2.29919, 3.58948, 6.85104))
def test27_sec(m): x = ek.linspace(m.Float, 1, 2, 10) ek.enable_grad(x) y = ek.sec(x * x) ek.backward(y) sec_x = ek.sec(ek.sqr(ek.detach(x))) assert ek.allclose(y, sec_x) assert ek.allclose( ek.grad(x), m.Float(5.76495, 19.2717, 412.208, 61.794, 10.3374, 3.64885, 1.35811, -0.0672242, -1.88437, -7.08534))
def test26_csc(m): x = ek.linspace(m.Float, 1, 2, 10) ek.enable_grad(x) y = ek.csc(x * x) ek.backward(y) csc_x = ek.csc(ek.sqr(ek.detach(x))) assert ek.allclose(y, csc_x) assert ek.allclose(ek.grad(x), m.Float(-1.52612, -0.822733, -0.189079, 0.572183, 1.88201, 5.34839, 24.6017, 9951.86, 20.1158, 4.56495), rtol=5e-5)
def test41_replace_grad(m): x = m.Array3f(1, 2, 3) y = m.Array3f(3, 2, 1) ek.enable_grad(x, y) x2 = x * x y2 = y * y z = ek.replace_grad(x2, y2) z2 = z * z ek.backward(z2) assert ek.allclose(z2, [1, 16, 81]) assert ek.grad(x) == 0 assert ek.allclose(ek.grad(y), [12, 32, 36])
def test28_cot(m): x = ek.linspace(m.Float, 1, 2, 10) ek.enable_grad(x) y = ek.cot(x * x) ek.backward(y) cot_x = ek.cot(ek.sqr(ek.detach(x))) assert ek.allclose(y, cot_x) assert ek.allclose(ek.grad(x), m.Float(-2.82457, -2.49367, -2.45898, -2.78425, -3.81687, -7.12557, -26.3248, -9953.63, -22.0932, -6.98385), rtol=5e-5)
def test39_atanh(m): x = ek.linspace(m.Float, -.99, .99, 10) ek.enable_grad(x) y = ek.atanh(x) ek.backward(y) assert ek.allclose( y, m.Float(-2.64665, -1.02033, -0.618381, -0.342828, -0.110447, 0.110447, 0.342828, 0.618381, 1.02033, 2.64665)) assert ek.allclose( ek.grad(x), m.Float(50.2513, 2.4564, 1.43369, 1.12221, 1.01225, 1.01225, 1.12221, 1.43369, 2.4564, 50.2513))
def test38_acosh(m): x = ek.linspace(m.Float, 1.01, 2, 10) ek.enable_grad(x) y = ek.acosh(x) ek.backward(y) assert ek.allclose( y, m.Float(0.141304, 0.485127, 0.665864, 0.802882, 0.916291, 1.01426, 1.10111, 1.17944, 1.25098, 1.31696)) assert ek.allclose( ek.grad(x), m.Float(7.05346, 1.98263, 1.39632, 1.12112, 0.952381, 0.835191, 0.747665, 0.679095, 0.623528, 0.57735))
def test37_asinh(m): x = ek.linspace(m.Float, -.9, .9, 10) ek.enable_grad(x) y = ek.asinh(x) ek.backward(y) assert ek.allclose( y, m.Float(-0.808867, -0.652667, -0.481212, -0.295673, -0.0998341, 0.0998341, 0.295673, 0.481212, 0.652667, 0.808867)) assert ek.allclose( ek.grad(x), m.Float(0.743294, 0.819232, 0.894427, 0.957826, 0.995037, 0.995037, 0.957826, 0.894427, 0.819232, 0.743294))
def test36_tanh(m): x = ek.linspace(m.Float, -1, 1, 10) ek.enable_grad(x) y = ek.tanh(x) ek.backward(y) assert ek.allclose( y, m.Float(-0.761594, -0.651429, -0.504672, -0.321513, -0.110656, 0.110656, 0.321513, 0.504672, 0.651429, 0.761594)) assert ek.allclose( ek.grad(x), m.Float(0.419974, 0.57564, 0.745306, 0.89663, 0.987755, 0.987755, 0.89663, 0.745306, 0.57564, 0.419974))