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}");
        }
예제 #2
0
        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}");
        }