public void ExecuteTest() { float max_err = 0; foreach (int batch in new int[] { 1, 2, 3 }) { foreach (int inchannels in new int[] { 2, 4, 10, 20 }) { foreach (int outchannels in new int[] { 6, 14 }) { 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[] yval = (new float[outwidth * outchannels * batch]).Select((_, idx) => idx * 1e-3f).ToArray(); float[] wval = (new float[kwidth * inchannels * outchannels / 2]).Select((_, idx) => idx * 1e-3f).Reverse().ToArray(); System.Numerics.Complex[] ycval = (new System.Numerics.Complex[yval.Length / 2]) .Select((_, idx) => new System.Numerics.Complex(yval[idx * 2], yval[idx * 2 + 1])).ToArray(); System.Numerics.Complex[] wcval = (new System.Numerics.Complex[wval.Length / 2]) .Select((_, idx) => new System.Numerics.Complex(wval[idx * 2], wval[idx * 2 + 1])).ToArray(); ComplexMap1D y = new ComplexMap1D(outchannels / 2, outwidth, batch, ycval); ComplexFilter1D w = new ComplexFilter1D(inchannels / 2, outchannels / 2, kwidth, wcval); ComplexMap1D x = Reference(y, w, inwidth, kwidth, stride); OverflowCheckedTensor y_tensor = new OverflowCheckedTensor(Shape.Map1D(outchannels, outwidth, batch), yval); OverflowCheckedTensor w_tensor = new OverflowCheckedTensor(Shape.Kernel1D(inchannels, outchannels / 2, kwidth), wval); OverflowCheckedTensor x_tensor = new OverflowCheckedTensor(Shape.Map1D(inchannels, inwidth, batch)); ComplexDeconvolution1D ope = new ComplexDeconvolution1D(inwidth, outchannels, inchannels, kwidth, stride, gradmode: false, batch); ope.Execute(y_tensor, w_tensor, x_tensor); float[] x_expect = x.ToArray(); float[] x_actual = x_tensor.State; CollectionAssert.AreEqual(yval, y_tensor.State); CollectionAssert.AreEqual(wval, w_tensor.State); AssertError.Tolerance(x_expect, x_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 = 6, outchannels = 8, 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 / 2]).Select((_, idx) => idx * 1e-3f).Reverse().ToArray(); System.Numerics.Complex[] xcval = (new System.Numerics.Complex[xval.Length / 2]) .Select((_, idx) => new System.Numerics.Complex(xval[idx * 2], xval[idx * 2 + 1])).ToArray(); System.Numerics.Complex[] wcval = (new System.Numerics.Complex[wval.Length / 2]) .Select((_, idx) => new System.Numerics.Complex(wval[idx * 2], wval[idx * 2 + 1])).ToArray(); ComplexMap1D x = new ComplexMap1D(inchannels / 2, inwidth, batch, xcval); ComplexFilter1D w = new ComplexFilter1D(inchannels / 2, outchannels / 2, kwidth, wcval); ComplexMap1D y = Reference(x, w, kwidth, stride); float[] y_expect = { -3.240000000e-04f, 5.037000000e-03f, -2.700000000e-04f, 4.119000000e-03f, -2.160000000e-04f, 3.201000000e-03f, -1.620000000e-04f, 2.283000000e-03f, -2.160000000e-04f, 1.464900000e-02f, -1.620000000e-04f, 1.243500000e-02f, -1.080000000e-04f, 1.022100000e-02f, -5.400000000e-05f, 8.007000000e-03f, -1.080000000e-04f, 2.426100000e-02f, -5.400000000e-05f, 2.075100000e-02f, 1.734723476e-18f, 1.724100000e-02f, 5.400000000e-05f, 1.373100000e-02f, 0.000000000e+00f, 3.387300000e-02f, 5.400000000e-05f, 2.906700000e-02f, 1.080000000e-04f, 2.426100000e-02f, 1.620000000e-04f, 1.945500000e-02f, 1.080000000e-04f, 4.348500000e-02f, 1.620000000e-04f, 3.738300000e-02f, 2.160000000e-04f, 3.128100000e-02f, 2.700000000e-04f, 2.517900000e-02f, 2.160000000e-04f, 5.309700000e-02f, 2.700000000e-04f, 4.569900000e-02f, 3.240000000e-04f, 3.830100000e-02f, 3.780000000e-04f, 3.090300000e-02f, 3.780000000e-04f, 6.751500000e-02f, 4.320000000e-04f, 5.817300000e-02f, 4.860000000e-04f, 4.883100000e-02f, 5.400000000e-04f, 3.948900000e-02f, 4.860000000e-04f, 7.712700000e-02f, 5.400000000e-04f, 6.648900000e-02f, 5.940000000e-04f, 5.585100000e-02f, 6.480000000e-04f, 4.521300000e-02f, 5.940000000e-04f, 8.673900000e-02f, 6.480000000e-04f, 7.480500000e-02f, 7.020000000e-04f, 6.287100000e-02f, 7.560000000e-04f, 5.093700000e-02f, 7.020000000e-04f, 9.635100000e-02f, 7.560000000e-04f, 8.312100000e-02f, 8.100000000e-04f, 6.989100000e-02f, 8.640000000e-04f, 5.666100000e-02f, 8.100000000e-04f, 1.059630000e-01f, 8.640000000e-04f, 9.143700000e-02f, 9.180000000e-04f, 7.691100000e-02f, 9.720000000e-04f, 6.238500000e-02f, 9.180000000e-04f, 1.155750000e-01f, 9.720000000e-04f, 9.975300000e-02f, 1.026000000e-03f, 8.393100000e-02f, 1.080000000e-03f, 6.810900000e-02f, 1.080000000e-03f, 1.299930000e-01f, 1.134000000e-03f, 1.122270000e-01f, 1.188000000e-03f, 9.446100000e-02f, 1.242000000e-03f, 7.669500000e-02f, 1.188000000e-03f, 1.396050000e-01f, 1.242000000e-03f, 1.205430000e-01f, 1.296000000e-03f, 1.014810000e-01f, 1.350000000e-03f, 8.241900000e-02f, 1.296000000e-03f, 1.492170000e-01f, 1.350000000e-03f, 1.288590000e-01f, 1.404000000e-03f, 1.085010000e-01f, 1.458000000e-03f, 8.814300000e-02f, 1.404000000e-03f, 1.588290000e-01f, 1.458000000e-03f, 1.371750000e-01f, 1.512000000e-03f, 1.155210000e-01f, 1.566000000e-03f, 9.386700000e-02f, 1.512000000e-03f, 1.684410000e-01f, 1.566000000e-03f, 1.454910000e-01f, 1.620000000e-03f, 1.225410000e-01f, 1.674000000e-03f, 9.959100000e-02f, 1.620000000e-03f, 1.780530000e-01f, 1.674000000e-03f, 1.538070000e-01f, 1.728000000e-03f, 1.295610000e-01f, 1.782000000e-03f, 1.053150000e-01f, }; 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 = 6, outchannels = 8, 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 / 2]).Select((_, idx) => idx * 1e-3f).Reverse().ToArray(); System.Numerics.Complex[] ycval = (new System.Numerics.Complex[yval.Length / 2]) .Select((_, idx) => new System.Numerics.Complex(yval[idx * 2], yval[idx * 2 + 1])).ToArray(); System.Numerics.Complex[] wcval = (new System.Numerics.Complex[wval.Length / 2]) .Select((_, idx) => new System.Numerics.Complex(wval[idx * 2], wval[idx * 2 + 1])).ToArray(); ComplexMap1D y = new ComplexMap1D(outchannels / 2, outwidth, batch, ycval); ComplexFilter1D w = new ComplexFilter1D(inchannels / 2, outchannels / 2, kwidth, wcval); ComplexMap1D x = Reference(y, w, inwidth, kwidth, stride); float[] x_expect = { -2.320000000e-04f, 1.604000000e-03f, -2.240000000e-04f, 1.548000000e-03f, -2.160000000e-04f, 1.492000000e-03f, -1.360000000e-04f, 9.320000000e-04f, -1.280000000e-04f, 8.760000000e-04f, -1.200000000e-04f, 8.200000000e-04f, -2.400000000e-04f, 5.800000000e-03f, -2.240000000e-04f, 5.560000000e-03f, -2.080000000e-04f, 5.320000000e-03f, -1.040000000e-04f, 3.332000000e-03f, -9.600000000e-05f, 3.148000000e-03f, -8.800000000e-05f, 2.964000000e-03f, -1.760000000e-04f, 1.060000000e-02f, -1.600000000e-04f, 1.010400000e-02f, -1.440000000e-04f, 9.608000000e-03f, -7.200000000e-05f, 5.732000000e-03f, -6.400000000e-05f, 5.420000000e-03f, -5.600000000e-05f, 5.108000000e-03f, -1.120000000e-04f, 1.540000000e-02f, -9.600000000e-05f, 1.464800000e-02f, -8.000000000e-05f, 1.389600000e-02f, -4.000000000e-05f, 8.132000000e-03f, -3.200000000e-05f, 7.692000000e-03f, -2.400000000e-05f, 7.252000000e-03f, -4.800000000e-05f, 2.020000000e-02f, -3.200000000e-05f, 1.919200000e-02f, -1.600000000e-05f, 1.818400000e-02f, -8.000000000e-06f, 1.053200000e-02f, 0.000000000e+00f, 9.964000000e-03f, 8.000000000e-06f, 9.396000000e-03f, 1.600000000e-05f, 2.500000000e-02f, 3.200000000e-05f, 2.373600000e-02f, 4.800000000e-05f, 2.247200000e-02f, 2.400000000e-05f, 1.293200000e-02f, 3.200000000e-05f, 1.223600000e-02f, 4.000000000e-05f, 1.154000000e-02f, 1.200000000e-04f, 4.580000000e-03f, 1.280000000e-04f, 3.884000000e-03f, 1.360000000e-04f, 3.188000000e-03f, -4.000000000e-05f, 2.522000000e-02f, -3.200000000e-05f, 2.439600000e-02f, -2.400000000e-05f, 2.357200000e-02f, 5.600000000e-05f, 1.533200000e-02f, 6.400000000e-05f, 1.450800000e-02f, 7.200000000e-05f, 1.368400000e-02f, 1.440000000e-04f, 3.460000000e-02f, 1.600000000e-04f, 3.282400000e-02f, 1.760000000e-04f, 3.104800000e-02f, 8.800000000e-05f, 1.773200000e-02f, 9.600000000e-05f, 1.678000000e-02f, 1.040000000e-04f, 1.582800000e-02f, 2.080000000e-04f, 3.940000000e-02f, 2.240000000e-04f, 3.736800000e-02f, 2.400000000e-04f, 3.533600000e-02f, 1.200000000e-04f, 2.013200000e-02f, 1.280000000e-04f, 1.905200000e-02f, 1.360000000e-04f, 1.797200000e-02f, 2.720000000e-04f, 4.420000000e-02f, 2.880000000e-04f, 4.191200000e-02f, 3.040000000e-04f, 3.962400000e-02f, 1.520000000e-04f, 2.253200000e-02f, 1.600000000e-04f, 2.132400000e-02f, 1.680000000e-04f, 2.011600000e-02f, 3.360000000e-04f, 4.900000000e-02f, 3.520000000e-04f, 4.645600000e-02f, 3.680000000e-04f, 4.391200000e-02f, 1.840000000e-04f, 2.493200000e-02f, 1.920000000e-04f, 2.359600000e-02f, 2.000000000e-04f, 2.226000000e-02f, 4.000000000e-04f, 5.380000000e-02f, 4.160000000e-04f, 5.100000000e-02f, 4.320000000e-04f, 4.820000000e-02f, 2.160000000e-04f, 2.733200000e-02f, 2.240000000e-04f, 2.586800000e-02f, 2.320000000e-04f, 2.440400000e-02f, 3.120000000e-04f, 9.764000000e-03f, 3.200000000e-04f, 8.300000000e-03f, 3.280000000e-04f, 6.836000000e-03f, 1.520000000e-04f, 4.883600000e-02f, 1.600000000e-04f, 4.724400000e-02f, 1.680000000e-04f, 4.565200000e-02f, 2.480000000e-04f, 2.973200000e-02f, 2.560000000e-04f, 2.814000000e-02f, 2.640000000e-04f, 2.654800000e-02f, 5.280000000e-04f, 6.340000000e-02f, 5.440000000e-04f, 6.008800000e-02f, 5.600000000e-04f, 5.677600000e-02f, 2.800000000e-04f, 3.213200000e-02f, 2.880000000e-04f, 3.041200000e-02f, 2.960000000e-04f, 2.869200000e-02f, 5.920000000e-04f, 6.820000000e-02f, 6.080000000e-04f, 6.463200000e-02f, 6.240000000e-04f, 6.106400000e-02f, 3.120000000e-04f, 3.453200000e-02f, 3.200000000e-04f, 3.268400000e-02f, 3.280000000e-04f, 3.083600000e-02f, 6.560000000e-04f, 7.300000000e-02f, 6.720000000e-04f, 6.917600000e-02f, 6.880000000e-04f, 6.535200000e-02f, 3.440000000e-04f, 3.693200000e-02f, 3.520000000e-04f, 3.495600000e-02f, 3.600000000e-04f, 3.298000000e-02f, 7.200000000e-04f, 7.780000000e-02f, 7.360000000e-04f, 7.372000000e-02f, 7.520000000e-04f, 6.964000000e-02f, 3.760000000e-04f, 3.933200000e-02f, 3.840000000e-04f, 3.722800000e-02f, 3.920000000e-04f, 3.512400000e-02f, 7.840000000e-04f, 8.260000000e-02f, 8.000000000e-04f, 7.826400000e-02f, 8.160000000e-04f, 7.392800000e-02f, 4.080000000e-04f, 4.173200000e-02f, 4.160000000e-04f, 3.950000000e-02f, 4.240000000e-04f, 3.726800000e-02f, 5.040000000e-04f, 1.494800000e-02f, 5.120000000e-04f, 1.271600000e-02f, 5.200000000e-04f, 1.048400000e-02f, }; float[] x_actual = x.ToArray(); AssertError.Tolerance(x_expect, x_actual, 1e-7f, 1e-5f, $"mismatch value {inchannels},{outchannels},{kwidth},{stride},{inwidth},{batch}"); }