public void ExecuteTest() { float max_err = 0; foreach (int batch in new int[] { 1, 2, 3 }) { foreach (int inchannels in new int[] { 4, 8, 12 }) { foreach (int outchannels in new int[] { 4, 8, 12 }) { foreach (int kwidth in new int[] { 1, 3, 5 }) { foreach (int stride in new int[] { 1, 2, 3 }) { foreach (int inwidth in new int[] { 8, 9, 13, 17 }) { int outwidth = (inwidth - kwidth) / stride + 1; float[] xval = (new float[inwidth * inchannels * batch]).Select((_, idx) => idx * 1e-3f).ToArray(); float[] wval = (new float[kwidth * inchannels * outchannels / 4]).Select((_, idx) => idx * 1e-3f).Reverse().ToArray(); Quaternion[] xcval = (new Quaternion[xval.Length / 4]) .Select((_, idx) => new Quaternion(xval[idx * 4], xval[idx * 4 + 1], xval[idx * 4 + 2], xval[idx * 4 + 3])).ToArray(); Quaternion[] wcval = (new Quaternion[wval.Length / 4]) .Select((_, idx) => new Quaternion(wval[idx * 4], wval[idx * 4 + 1], wval[idx * 4 + 2], wval[idx * 4 + 3])).ToArray(); QuaternionMap1D x = new QuaternionMap1D(inchannels / 4, inwidth, batch, xcval); QuaternionFilter1D w = new QuaternionFilter1D(inchannels / 4, outchannels / 4, kwidth, wcval); QuaternionMap1D y = Reference(x, w, kwidth, stride); OverflowCheckedTensor x_tensor = new OverflowCheckedTensor(Shape.Map1D(inchannels, inwidth, batch), xval); OverflowCheckedTensor w_tensor = new OverflowCheckedTensor(Shape.Kernel1D(inchannels, outchannels / 4, kwidth), wval); OverflowCheckedTensor y_tensor = new OverflowCheckedTensor(Shape.Map1D(outchannels, outwidth, batch)); QuaternionConvolution1D ope = new QuaternionConvolution1D(inwidth, inchannels, outchannels, kwidth, stride, gradmode: false, batch); ope.Execute(x_tensor, w_tensor, y_tensor); float[] y_expect = y.ToArray(); float[] y_actual = y_tensor.State; CollectionAssert.AreEqual(xval, x_tensor.State); CollectionAssert.AreEqual(wval, w_tensor.State); AssertError.Tolerance(y_expect, y_actual, 1e-7f, 1e-5f, ref max_err, $"mismatch value {inchannels},{outchannels},{kwidth},{stride},{inwidth},{batch}"); Console.WriteLine($"pass: {inchannels},{outchannels},{kwidth},{stride},{inwidth},{batch}"); } } } } } } Console.WriteLine($"maxerr:{max_err}"); }
public void ReferenceTest() { int inchannels = 8, outchannels = 12, kwidth = 3, stride = 2, inwidth = 13, batch = 3; int outwidth = (inwidth - kwidth) / stride + 1; float[] xval = (new float[batch * inwidth * inchannels]).Select((_, idx) => idx * 1e-3f).ToArray(); float[] wval = (new float[kwidth * outchannels * inchannels / 4]).Select((_, idx) => idx * 1e-3f).Reverse().ToArray(); Quaternion[] xcval = (new Quaternion[xval.Length / 4]) .Select((_, idx) => new Quaternion(xval[idx * 4], xval[idx * 4 + 1], xval[idx * 4 + 2], xval[idx * 4 + 3])).ToArray(); Quaternion[] wcval = (new Quaternion[wval.Length / 4]) .Select((_, idx) => new Quaternion(wval[idx * 4], wval[idx * 4 + 1], wval[idx * 4 + 2], wval[idx * 4 + 3])).ToArray(); QuaternionMap1D x = new QuaternionMap1D(inchannels / 4, inwidth, batch, xcval); QuaternionFilter1D w = new QuaternionFilter1D(inchannels / 4, outchannels / 4, kwidth, wcval); QuaternionMap1D y = Reference(x, w, kwidth, stride); float[] y_expect = { -4.992000000e-03f, 3.696000000e-03f, 4.896000000e-03f, 4.116000000e-03f, -3.744000000e-03f, 2.736000000e-03f, 3.744000000e-03f, 3.060000000e-03f, -2.496000000e-03f, 1.776000000e-03f, 2.592000000e-03f, 2.004000000e-03f, -1.305600000e-02f, 1.214400000e-02f, 1.353600000e-02f, 1.237200000e-02f, -1.027200000e-02f, 9.648000000e-03f, 1.084800000e-02f, 9.780000000e-03f, -7.488000000e-03f, 7.152000000e-03f, 8.160000000e-03f, 7.188000000e-03f, -2.112000000e-02f, 2.059200000e-02f, 2.217600000e-02f, 2.062800000e-02f, -1.680000000e-02f, 1.656000000e-02f, 1.795200000e-02f, 1.650000000e-02f, -1.248000000e-02f, 1.252800000e-02f, 1.372800000e-02f, 1.237200000e-02f, -2.918400000e-02f, 2.904000000e-02f, 3.081600000e-02f, 2.888400000e-02f, -2.332800000e-02f, 2.347200000e-02f, 2.505600000e-02f, 2.322000000e-02f, -1.747200000e-02f, 1.790400000e-02f, 1.929600000e-02f, 1.755600000e-02f, -3.724800000e-02f, 3.748800000e-02f, 3.945600000e-02f, 3.714000000e-02f, -2.985600000e-02f, 3.038400000e-02f, 3.216000000e-02f, 2.994000000e-02f, -2.246400000e-02f, 2.328000000e-02f, 2.486400000e-02f, 2.274000000e-02f, -4.531200000e-02f, 4.593600000e-02f, 4.809600000e-02f, 4.539600000e-02f, -3.638400000e-02f, 3.729600000e-02f, 3.926400000e-02f, 3.666000000e-02f, -2.745600000e-02f, 2.865600000e-02f, 3.043200000e-02f, 2.792400000e-02f, -5.740800000e-02f, 5.860800000e-02f, 6.105600000e-02f, 5.778000000e-02f, -4.617600000e-02f, 4.766400000e-02f, 4.992000000e-02f, 4.674000000e-02f, -3.494400000e-02f, 3.672000000e-02f, 3.878400000e-02f, 3.570000000e-02f, -6.547200000e-02f, 6.705600000e-02f, 6.969600000e-02f, 6.603600000e-02f, -5.270400000e-02f, 5.457600000e-02f, 5.702400000e-02f, 5.346000000e-02f, -3.993600000e-02f, 4.209600000e-02f, 4.435200000e-02f, 4.088400000e-02f, -7.353600000e-02f, 7.550400000e-02f, 7.833600000e-02f, 7.429200000e-02f, -5.923200000e-02f, 6.148800000e-02f, 6.412800000e-02f, 6.018000000e-02f, -4.492800000e-02f, 4.747200000e-02f, 4.992000000e-02f, 4.606800000e-02f, -8.160000000e-02f, 8.395200000e-02f, 8.697600000e-02f, 8.254800000e-02f, -6.576000000e-02f, 6.840000000e-02f, 7.123200000e-02f, 6.690000000e-02f, -4.992000000e-02f, 5.284800000e-02f, 5.548800000e-02f, 5.125200000e-02f, -8.966400000e-02f, 9.240000000e-02f, 9.561600000e-02f, 9.080400000e-02f, -7.228800000e-02f, 7.531200000e-02f, 7.833600000e-02f, 7.362000000e-02f, -5.491200000e-02f, 5.822400000e-02f, 6.105600000e-02f, 5.643600000e-02f, -9.772800000e-02f, 1.008480000e-01f, 1.042560000e-01f, 9.906000000e-02f, -7.881600000e-02f, 8.222400000e-02f, 8.544000000e-02f, 8.034000000e-02f, -5.990400000e-02f, 6.360000000e-02f, 6.662400000e-02f, 6.162000000e-02f, -1.098240000e-01f, 1.135200000e-01f, 1.172160000e-01f, 1.114440000e-01f, -8.860800000e-02f, 9.259200000e-02f, 9.609600000e-02f, 9.042000000e-02f, -6.739200000e-02f, 7.166400000e-02f, 7.497600000e-02f, 6.939600000e-02f, -1.178880000e-01f, 1.219680000e-01f, 1.258560000e-01f, 1.197000000e-01f, -9.513600000e-02f, 9.950400000e-02f, 1.032000000e-01f, 9.714000000e-02f, -7.238400000e-02f, 7.704000000e-02f, 8.054400000e-02f, 7.458000000e-02f, -1.259520000e-01f, 1.304160000e-01f, 1.344960000e-01f, 1.279560000e-01f, -1.016640000e-01f, 1.064160000e-01f, 1.103040000e-01f, 1.038600000e-01f, -7.737600000e-02f, 8.241600000e-02f, 8.611200000e-02f, 7.976400000e-02f, -1.340160000e-01f, 1.388640000e-01f, 1.431360000e-01f, 1.362120000e-01f, -1.081920000e-01f, 1.133280000e-01f, 1.174080000e-01f, 1.105800000e-01f, -8.236800000e-02f, 8.779200000e-02f, 9.168000000e-02f, 8.494800000e-02f, -1.420800000e-01f, 1.473120000e-01f, 1.517760000e-01f, 1.444680000e-01f, -1.147200000e-01f, 1.202400000e-01f, 1.245120000e-01f, 1.173000000e-01f, -8.736000000e-02f, 9.316800000e-02f, 9.724800000e-02f, 9.013200000e-02f, -1.501440000e-01f, 1.557600000e-01f, 1.604160000e-01f, 1.527240000e-01f, -1.212480000e-01f, 1.271520000e-01f, 1.316160000e-01f, 1.240200000e-01f, -9.235200000e-02f, 9.854400000e-02f, 1.028160000e-01f, 9.531600000e-02f, }; float[] y_actual = y.ToArray(); AssertError.Tolerance(y_expect, y_actual, 1e-7f, 1e-5f, $"mismatch value {inchannels},{outchannels},{kwidth},{stride},{inwidth},{batch}"); }
public void ReferenceTest() { int inchannels = 8, outchannels = 12, kwidth = 3, stride = 2, inwidth = 13, batch = 3; int outwidth = (inwidth - kwidth) / stride + 1; float[] yval = (new float[outwidth * outchannels * batch]).Select((_, idx) => idx * 1e-3f).ToArray(); float[] wval = (new float[kwidth * outchannels * inchannels / 4]).Select((_, idx) => idx * 1e-3f).Reverse().ToArray(); Quaternion[] ycval = (new Quaternion[yval.Length / 4]) .Select((_, idx) => new Quaternion(yval[idx * 4], yval[idx * 4 + 1], yval[idx * 4 + 2], yval[idx * 4 + 3])).ToArray(); Quaternion[] wcval = (new Quaternion[wval.Length / 4]) .Select((_, idx) => new Quaternion(wval[idx * 4], wval[idx * 4 + 1], wval[idx * 4 + 2], wval[idx * 4 + 3])).ToArray(); QuaternionMap1D y = new QuaternionMap1D(outchannels / 4, outwidth, batch, ycval); QuaternionFilter1D w = new QuaternionFilter1D(inchannels / 4, outchannels / 4, kwidth, wcval); QuaternionMap1D x = Reference(y, w, inwidth, kwidth, stride); float[] x_expect = { -2.404000000e-03f, 1.360000000e-03f, 2.140000000e-03f, 1.714000000e-03f, -2.236000000e-03f, 1.264000000e-03f, 1.996000000e-03f, 1.594000000e-03f, -1.396000000e-03f, 7.840000000e-04f, 1.276000000e-03f, 9.940000000e-04f, -1.228000000e-03f, 6.880000000e-04f, 1.132000000e-03f, 8.740000000e-04f, -7.112000000e-03f, 6.032000000e-03f, 7.088000000e-03f, 6.380000000e-03f, -6.488000000e-03f, 5.552000000e-03f, 6.512000000e-03f, 5.852000000e-03f, -3.988000000e-03f, 3.520000000e-03f, 4.084000000e-03f, 3.658000000e-03f, -3.532000000e-03f, 3.136000000e-03f, 3.652000000e-03f, 3.250000000e-03f, -1.229600000e-02f, 1.150400000e-02f, 1.270400000e-02f, 1.170800000e-02f, -1.109600000e-02f, 1.044800000e-02f, 1.155200000e-02f, 1.060400000e-02f, -6.580000000e-03f, 6.256000000e-03f, 6.892000000e-03f, 6.322000000e-03f, -5.836000000e-03f, 5.584000000e-03f, 6.172000000e-03f, 5.626000000e-03f, -1.748000000e-02f, 1.697600000e-02f, 1.832000000e-02f, 1.703600000e-02f, -1.570400000e-02f, 1.534400000e-02f, 1.659200000e-02f, 1.535600000e-02f, -9.172000000e-03f, 8.992000000e-03f, 9.700000000e-03f, 8.986000000e-03f, -8.140000000e-03f, 8.032000000e-03f, 8.692000000e-03f, 8.002000000e-03f, -2.266400000e-02f, 2.244800000e-02f, 2.393600000e-02f, 2.236400000e-02f, -2.031200000e-02f, 2.024000000e-02f, 2.163200000e-02f, 2.010800000e-02f, -1.176400000e-02f, 1.172800000e-02f, 1.250800000e-02f, 1.165000000e-02f, -1.044400000e-02f, 1.048000000e-02f, 1.121200000e-02f, 1.037800000e-02f, -2.784800000e-02f, 2.792000000e-02f, 2.955200000e-02f, 2.769200000e-02f, -2.492000000e-02f, 2.513600000e-02f, 2.667200000e-02f, 2.486000000e-02f, -1.435600000e-02f, 1.446400000e-02f, 1.531600000e-02f, 1.431400000e-02f, -1.274800000e-02f, 1.292800000e-02f, 1.373200000e-02f, 1.275400000e-02f, -4.708000000e-03f, 5.248000000e-03f, 5.812000000e-03f, 4.954000000e-03f, -3.100000000e-03f, 3.712000000e-03f, 4.228000000e-03f, 3.394000000e-03f, -2.832400000e-02f, 2.814400000e-02f, 2.935600000e-02f, 2.806600000e-02f, -2.642800000e-02f, 2.632000000e-02f, 2.748400000e-02f, 2.621800000e-02f, -1.694800000e-02f, 1.720000000e-02f, 1.812400000e-02f, 1.697800000e-02f, -1.505200000e-02f, 1.537600000e-02f, 1.625200000e-02f, 1.513000000e-02f, -3.821600000e-02f, 3.886400000e-02f, 4.078400000e-02f, 3.834800000e-02f, -3.413600000e-02f, 3.492800000e-02f, 3.675200000e-02f, 3.436400000e-02f, -1.954000000e-02f, 1.993600000e-02f, 2.093200000e-02f, 1.964200000e-02f, -1.735600000e-02f, 1.782400000e-02f, 1.877200000e-02f, 1.750600000e-02f, -4.340000000e-02f, 4.433600000e-02f, 4.640000000e-02f, 4.367600000e-02f, -3.874400000e-02f, 3.982400000e-02f, 4.179200000e-02f, 3.911600000e-02f, -2.213200000e-02f, 2.267200000e-02f, 2.374000000e-02f, 2.230600000e-02f, -1.966000000e-02f, 2.027200000e-02f, 2.129200000e-02f, 1.988200000e-02f, -4.858400000e-02f, 4.980800000e-02f, 5.201600000e-02f, 4.900400000e-02f, -4.335200000e-02f, 4.472000000e-02f, 4.683200000e-02f, 4.386800000e-02f, -2.472400000e-02f, 2.540800000e-02f, 2.654800000e-02f, 2.497000000e-02f, -2.196400000e-02f, 2.272000000e-02f, 2.381200000e-02f, 2.225800000e-02f, -5.376800000e-02f, 5.528000000e-02f, 5.763200000e-02f, 5.433200000e-02f, -4.796000000e-02f, 4.961600000e-02f, 5.187200000e-02f, 4.862000000e-02f, -2.731600000e-02f, 2.814400000e-02f, 2.935600000e-02f, 2.763400000e-02f, -2.426800000e-02f, 2.516800000e-02f, 2.633200000e-02f, 2.463400000e-02f, -5.895200000e-02f, 6.075200000e-02f, 6.324800000e-02f, 5.966000000e-02f, -5.256800000e-02f, 5.451200000e-02f, 5.691200000e-02f, 5.337200000e-02f, -2.990800000e-02f, 3.088000000e-02f, 3.216400000e-02f, 3.029800000e-02f, -2.657200000e-02f, 2.761600000e-02f, 2.885200000e-02f, 2.701000000e-02f, -9.892000000e-03f, 1.129600000e-02f, 1.229200000e-02f, 1.057000000e-02f, -6.556000000e-03f, 8.032000000e-03f, 8.980000000e-03f, 7.282000000e-03f, -5.424400000e-02f, 5.492800000e-02f, 5.657200000e-02f, 5.441800000e-02f, -5.062000000e-02f, 5.137600000e-02f, 5.297200000e-02f, 5.084200000e-02f, -3.250000000e-02f, 3.361600000e-02f, 3.497200000e-02f, 3.296200000e-02f, -2.887600000e-02f, 3.006400000e-02f, 3.137200000e-02f, 2.938600000e-02f, -6.932000000e-02f, 7.169600000e-02f, 7.448000000e-02f, 7.031600000e-02f, -6.178400000e-02f, 6.430400000e-02f, 6.699200000e-02f, 6.287600000e-02f, -3.509200000e-02f, 3.635200000e-02f, 3.778000000e-02f, 3.562600000e-02f, -3.118000000e-02f, 3.251200000e-02f, 3.389200000e-02f, 3.176200000e-02f, -7.450400000e-02f, 7.716800000e-02f, 8.009600000e-02f, 7.564400000e-02f, -6.639200000e-02f, 6.920000000e-02f, 7.203200000e-02f, 6.762800000e-02f, -3.768400000e-02f, 3.908800000e-02f, 4.058800000e-02f, 3.829000000e-02f, -3.348400000e-02f, 3.496000000e-02f, 3.641200000e-02f, 3.413800000e-02f, -7.968800000e-02f, 8.264000000e-02f, 8.571200000e-02f, 8.097200000e-02f, -7.100000000e-02f, 7.409600000e-02f, 7.707200000e-02f, 7.238000000e-02f, -4.027600000e-02f, 4.182400000e-02f, 4.339600000e-02f, 4.095400000e-02f, -3.578800000e-02f, 3.740800000e-02f, 3.893200000e-02f, 3.651400000e-02f, -8.487200000e-02f, 8.811200000e-02f, 9.132800000e-02f, 8.630000000e-02f, -7.560800000e-02f, 7.899200000e-02f, 8.211200000e-02f, 7.713200000e-02f, -4.286800000e-02f, 4.456000000e-02f, 4.620400000e-02f, 4.361800000e-02f, -3.809200000e-02f, 3.985600000e-02f, 4.145200000e-02f, 3.889000000e-02f, -9.005600000e-02f, 9.358400000e-02f, 9.694400000e-02f, 9.162800000e-02f, -8.021600000e-02f, 8.388800000e-02f, 8.715200000e-02f, 8.188400000e-02f, -4.546000000e-02f, 4.729600000e-02f, 4.901200000e-02f, 4.628200000e-02f, -4.039600000e-02f, 4.230400000e-02f, 4.397200000e-02f, 4.126600000e-02f, -1.507600000e-02f, 1.734400000e-02f, 1.877200000e-02f, 1.618600000e-02f, -1.001200000e-02f, 1.235200000e-02f, 1.373200000e-02f, 1.117000000e-02f, }; float[] x_actual = x.ToArray(); AssertError.Tolerance(x_expect, x_actual, 1e-7f, 1e-5f, $"mismatch value {inchannels},{outchannels},{kwidth},{stride},{inwidth},{batch}"); }