1 import grain.testing; 2 import std.typecons; 3 import numir; 4 import mir.ndslice; 5 import mir.math : pow; 6 7 auto p = 2.0f; 8 auto hfunc = Pow!(float, 2)(p); 9 auto hx = uniform!float(2, 3).slice.variable; 10 auto hy = hfunc.forward(hx); 11 auto hgy = uniform!float(2, 3).slice.variable; 12 auto hgx = hfunc.backward(hgy); 13 gradCheck(hfunc, hx, hgy, 1e-3, 1e-3, 1e-3); 14 assert(approxEqual(hy.sliced, hx.sliced.map!(a => pow(a, p)))); 15 16 version (grain_cuda) { 17 auto dfunc = Pow!(float, 2)(p); 18 auto dy = dfunc.forward(hx.to!DeviceStorage); 19 assert(approxEqual(dy.to!HostStorage.sliced, hy.sliced)); 20 auto dgx = dfunc.backward(hgy.to!DeviceStorage); 21 assert(approxEqual(dgx.to!HostStorage.sliced, hgx.sliced)); 22 }
y = pow x