def test_recursion(): """ Program: def f(n: i32, data: f32) -> f32 { if (n == 0) { return data; } else { return f(n - 1, log(data)); } } """ sb = relay.ScopeBuilder() f = relay.GlobalVar("f") ti32 = relay.scalar_type("int32") tf32 = relay.scalar_type("float32") n = relay.var("n", ti32) data = relay.var("data", tf32) with sb.if_scope(relay.equal(n, relay.const(0, ti32))): sb.ret(data) with sb.else_scope(): sb.ret(f(relay.subtract(n, relay.const(1, ti32)), relay.log(data))) env = relay.Environment() env[f] = relay.Function([n, data], sb.get()) assert "%3 = @f(%1, %2)" in env.astext() assert env[f].checked_type == relay.FuncType([ti32, tf32], tf32)
def test_env(): x = relay.var("x", "float32") y = relay.var("y", "float32") z = relay.add(x, y) z = relay.add(z, z) f = relay.Function([x, y], z) env = relay.Environment() env["myf"] = f text = env.astext() assert "def @myf" in text assert "%1 = add(%0, %0) # ty=float32" in text show(text)