Exemple #1
0
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
Exemple #2
0
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)
Exemple #3
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)))
Exemple #4
0
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])
Exemple #5
0
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])
Exemple #6
0
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])
Exemple #7
0
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])
Exemple #8
0
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])
Exemple #10
0
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))
Exemple #11
0
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))
Exemple #12
0
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)
Exemple #13
0
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)
Exemple #14
0
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])
Exemple #15
0
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
Exemple #16
0
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)
Exemple #17
0
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))
Exemple #18
0
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))
Exemple #19
0
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)
Exemple #20
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))
Exemple #21
0
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))
Exemple #22
0
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))
Exemple #23
0
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))
Exemple #24
0
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)
Exemple #25
0
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])
Exemple #26
0
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)
Exemple #27
0
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))
Exemple #28
0
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))
Exemple #29
0
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))
Exemple #30
0
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))