def map_forward(self, p): from mitsuba.core import Vector3f cos_theta = -p.y sin_theta = ek.safe_sqrt(ek.fnmadd(cos_theta, cos_theta, 1)) sin_phi, cos_phi = ek.sincos(p.x) return Vector3f(cos_phi * sin_theta, sin_phi * sin_theta, cos_theta)
def test40_safe_functions(m): x = ek.linspace(m.Float, 0, 1, 10) y = ek.linspace(m.Float, -1, 1, 10) z = ek.linspace(m.Float, -1, 1, 10) ek.enable_grad(x, y, z) x2 = ek.safe_sqrt(x) y2 = ek.safe_acos(y) z2 = ek.safe_asin(z) ek.backward(x2) ek.backward(y2) ek.backward(z2) assert ek.grad(x)[0] == 0 assert ek.allclose(ek.grad(x)[1], .5 / ek.sqrt(1 / 9)) assert x[0] == 0 assert ek.all(ek.isfinite(ek.grad(x))) assert ek.all(ek.isfinite(ek.grad(y))) assert ek.all(ek.isfinite(ek.grad(z)))