(target, dev)
| 196 | |
| 197 | @tvm.testing.parametrize_targets("llvm") |
| 198 | def test_matmul(target, dev): |
| 199 | @tvm.script.ir_module |
| 200 | class Before: |
| 201 | @R.function |
| 202 | def main(x: R.Tensor((3, 3), "float32"), y: R.Tensor((3, 3), "float32")): |
| 203 | with R.dataflow(): |
| 204 | lv1 = R.matmul(x, y) |
| 205 | lv2 = R.permute_dims(x) |
| 206 | lv3 = R.matmul(lv2, y) |
| 207 | lv4 = R.permute_dims(y) |
| 208 | lv5 = R.matmul(x, lv4) |
| 209 | lv6 = R.permute_dims(x) |
| 210 | lv7 = R.permute_dims(y) |
| 211 | lv8 = R.matmul(lv6, lv7) |
| 212 | lv9 = lv1 + lv3 + lv5 + lv8 |
| 213 | gv = R.sum(lv9) |
| 214 | R.output(gv) |
| 215 | return gv |
| 216 | |
| 217 | After = relax.transform.Gradient("main")(Before) |
| 218 | args = [] |
| 219 | for arg in After["main_adjoint"].params: |
| 220 | shape = [int(l) for l in arg.struct_info.shape] |
| 221 | args.append(rand("float32", *shape)) |
| 222 | |
| 223 | vm_before = _legalize_and_build(Before, target, dev) |
| 224 | vm_after = _legalize_and_build(After, target, dev) |
| 225 | _, grad = vm_after["main_adjoint"](*args) |
| 226 | |
| 227 | def func(*inputs): |
| 228 | loss = vm_before["main"](*[tvm.runtime.tensor(i) for i in inputs]) |
| 229 | return loss.numpy() |
| 230 | |
| 231 | check_numerical_grads(func, [i.numpy() for i in args], [i.numpy() for i in grad]) |
| 232 | |
| 233 | |
| 234 | if __name__ == "__main__": |
nothing calls this directly
no test coverage detected
searching dependent graphs…