コード例 #1
0
ファイル: test_x.cs プロジェクト: PetrochenkoYana/Diploma
    public static void Main(string[] args)
    {
        bool _TotalResult = true;
        bool _TestResult;

        System.Console.WriteLine("x-tests. Please wait...");
        alglib.alloc_counter_activate();
        System.Console.WriteLine("Allocation counter activated...");
        try
        {
            const int max1d = 70;
            const int max2d = 40;

            System.Console.WriteLine("Basic tests:");
            {
                // deallocateimmediately()
                alglib.minlbfgsstate s;
                double[]             x = new double[100];
                long cnt0, cnt1;
                cnt0 = alglib.alloc_counter();
                alglib.minlbfgscreate(x.Length, 10, x, out s);
                alglib.deallocateimmediately(ref s);
                cnt1        = alglib.alloc_counter();
                _TestResult = cnt1 <= cnt0;
                System.Console.WriteLine("* deallocateimmediately()    " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // boolean 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int n, i, cnt;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    bool[] arr0 = new bool[n];
                    bool[] arr1 = new bool[n];
                    bool[] arr2 = new bool[n];
                    bool[] arr3 = null;
                    cnt = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i] = alglib.math.randomreal() > 0.5;
                        arr1[i] = arr0[i];
                        arr2[i] = arr0[i];
                        if (arr0[i])
                        {
                            cnt++;
                        }
                    }
                    _TestResult = _TestResult && (alglib.xdebugb1count(arr0) == cnt);
                    alglib.xdebugb1not(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (arr1[i] == !arr0[i]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugb1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugb1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (arr3[i] == (i % 2 == 0));
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* boolean 1D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // integer 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int n, i, sum;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    int[] arr0 = new int[n];
                    int[] arr1 = new int[n];
                    int[] arr2 = new int[n];
                    int[] arr3 = null;
                    sum = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i] = alglib.math.randominteger(10);
                        arr1[i] = arr0[i];
                        arr2[i] = arr0[i];
                        sum    += arr0[i];
                    }
                    _TestResult = _TestResult && (alglib.xdebugi1sum(arr0) == sum);
                    alglib.xdebugi1neg(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (arr1[i] == -arr0[i]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugi1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugi1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            if (i % 2 == 0)
                            {
                                _TestResult = _TestResult && (arr3[i] == i);
                            }
                            else
                            {
                                _TestResult = _TestResult && (arr3[i] == 0);
                            }
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* integer 1D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // real 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int    n, i;
                double sum;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    double[] arr0 = new double[n];
                    double[] arr1 = new double[n];
                    double[] arr2 = new double[n];
                    double[] arr3 = null;
                    sum = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i] = alglib.math.randomreal() - 0.5;
                        arr1[i] = arr0[i];
                        arr2[i] = arr0[i];
                        sum    += arr0[i];
                    }
                    _TestResult = _TestResult && (Math.Abs(alglib.xdebugr1sum(arr0) - sum) < 1.0E-10);
                    alglib.xdebugr1neg(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (Math.Abs(arr1[i] + arr0[i]) < 1.0E-10);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugr1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugr1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            if (i % 2 == 0)
                            {
                                _TestResult = _TestResult && (arr3[i] == i * 0.25);
                            }
                            else
                            {
                                _TestResult = _TestResult && (arr3[i] == 0);
                            }
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* real 1D arrays             " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // complex 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int            n, i;
                alglib.complex sum;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    alglib.complex[] arr0 = new alglib.complex[n];
                    alglib.complex[] arr1 = new alglib.complex[n];
                    alglib.complex[] arr2 = new alglib.complex[n];
                    alglib.complex[] arr3 = null;
                    sum = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i].x = alglib.math.randomreal() - 0.5;
                        arr0[i].y = alglib.math.randomreal() - 0.5;
                        arr1[i]   = arr0[i];
                        arr2[i]   = arr0[i];
                        sum      += arr0[i];
                    }
                    _TestResult = _TestResult && (alglib.math.abscomplex(alglib.xdebugc1sum(arr0) - sum) < 1.0E-10);
                    alglib.xdebugc1neg(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (alglib.math.abscomplex(arr1[i] + arr0[i]) < 1.0E-10);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugc1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugc1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            if (i % 2 == 0)
                            {
                                _TestResult = _TestResult && (arr3[i].x == i * 0.250);
                                _TestResult = _TestResult && (arr3[i].y == i * 0.125);
                            }
                            else
                            {
                                _TestResult = _TestResult && (arr3[i] == 0);
                            }
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* complex 1D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // boolean 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int m, n, i, j, cnt;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        bool[,] arr0 = new bool[m, n];
                        bool[,] arr1 = new bool[m, n];
                        bool[,] arr2 = new bool[m, n];
                        bool[,] arr3 = null;
                        cnt          = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j] = alglib.math.randomreal() > 0.5;
                                arr1[i, j] = arr0[i, j];
                                arr2[i, j] = arr0[i, j];
                                if (arr0[i, j])
                                {
                                    cnt++;
                                }
                            }
                        }
                        _TestResult = _TestResult && (alglib.xdebugb2count(arr0) == cnt);
                        alglib.xdebugb2not(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == !arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugb2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugb2outsin(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr3[i, j] == (Math.Sin(3 * i + 5 * j) > 0));
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* boolean 2D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // integer 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int m, n, i, j;
                int sum;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        int[,] arr0 = new int[m, n];
                        int[,] arr1 = new int[m, n];
                        int[,] arr2 = new int[m, n];
                        int[,] arr3 = null;
                        sum         = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j] = alglib.math.randominteger(10);
                                arr1[i, j] = arr0[i, j];
                                arr2[i, j] = arr0[i, j];
                                sum       += arr0[i, j];
                            }
                        }
                        _TestResult = _TestResult && (alglib.xdebugi2sum(arr0) == sum);
                        alglib.xdebugi2neg(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == -arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugi2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugi2outsin(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr3[i, j] == System.Math.Sign(Math.Sin(3 * i + 5 * j)));
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* integer 2D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // real 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int    m, n, i, j;
                double sum;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        double[,] arr0 = new double[m, n];
                        double[,] arr1 = new double[m, n];
                        double[,] arr2 = new double[m, n];
                        double[,] arr3 = null;
                        sum            = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j] = alglib.math.randomreal() - 0.5;
                                arr1[i, j] = arr0[i, j];
                                arr2[i, j] = arr0[i, j];
                                sum       += arr0[i, j];
                            }
                        }
                        _TestResult = _TestResult && (System.Math.Abs(alglib.xdebugr2sum(arr0) - sum) < 1.0E-10);
                        alglib.xdebugr2neg(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == -arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugr2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugr2outsin(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (System.Math.Abs(arr3[i, j] - Math.Sin(3 * i + 5 * j)) < 1E-10);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* real 2D arrays             " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // real 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int            m, n, i, j;
                alglib.complex sum;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        alglib.complex[,] arr0 = new alglib.complex[m, n];
                        alglib.complex[,] arr1 = new alglib.complex[m, n];
                        alglib.complex[,] arr2 = new alglib.complex[m, n];
                        alglib.complex[,] arr3 = null;
                        sum = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j].x = alglib.math.randomreal() - 0.5;
                                arr0[i, j].y = alglib.math.randomreal() - 0.5;
                                arr1[i, j]   = arr0[i, j];
                                arr2[i, j]   = arr0[i, j];
                                sum         += arr0[i, j];
                            }
                        }
                        _TestResult = _TestResult && (alglib.math.abscomplex(alglib.xdebugc2sum(arr0) - sum) < 1.0E-10);
                        alglib.xdebugc2neg(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == -arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugc2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugc2outsincos(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (System.Math.Abs(arr3[i, j].x - Math.Sin(3 * i + 5 * j)) < 1E-10);
                                    _TestResult = _TestResult && (System.Math.Abs(arr3[i, j].y - Math.Cos(3 * i + 5 * j)) < 1E-10);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* complex 2D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // "biased product / sum" test
                int    m, n, i, j;
                double sum;
                _TestResult = true;
                for (n = 1; n <= max2d; n++)
                {
                    for (m = 1; m <= max2d; m++)
                    {
                        // proceed to testing
                        double[,] a = new double[m, n];
                        double[,] b = new double[m, n];
                        bool[,]   c = new bool[m, n];
                        sum         = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                a[i, j] = alglib.math.randomreal() - 0.5;
                                b[i, j] = alglib.math.randomreal() - 0.5;
                                c[i, j] = alglib.math.randomreal() > 0.5;
                                if (c[i, j])
                                {
                                    sum += a[i, j] * (1 + b[i, j]);
                                }
                            }
                        }
                        _TestResult = _TestResult && (Math.Abs(alglib.xdebugmaskedbiasedproductsum(m, n, a, b, c) - sum) < 1.0E-10);
                    }
                }
                System.Console.WriteLine("* multiple arrays            " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }


            //////////////////////////////////
            // Advanced tests
            //////
            System.Console.WriteLine("Advances tests:");

            //
            // Testing CSV functionality
            //
            {
                string csv_name = "alglib-tst-35252-ndg4sf.csv";
                _TestResult = true;
                try
                {
                    // CSV_DEFAULT must be zero
                    _TestResult = _TestResult && alglib.CSV_DEFAULT == 0;

                    // absent file - must fail
                    try
                    {
                        double[,] arr;
                        alglib.read_csv("nonexistent123foralgtestinglib", '\t', alglib.CSV_DEFAULT, out arr);
                        _TestResult = false;
                    }
                    catch
                    { }

                    // non-rectangular file - must fail
                    try
                    {
                        double[,] arr;
                        System.IO.File.WriteAllText(csv_name, "a,b,c\r\n1,2");
                        alglib.read_csv(csv_name, ',', alglib.CSV_SKIP_HEADERS, out arr);
                        System.IO.File.Delete(csv_name);
                        _TestResult = false;
                    }
                    catch
                    { }
                    try
                    {
                        double[,] arr;
                        System.IO.File.WriteAllText(csv_name, "a,b,c\r\n1,2,3,4");
                        alglib.read_csv(csv_name, ',', alglib.CSV_SKIP_HEADERS, out arr);
                        System.IO.File.Delete(csv_name);
                        _TestResult = false;
                    }
                    catch
                    { }
                    try
                    {
                        double[,] arr;
                        System.IO.File.WriteAllText(csv_name, "1,2,3,4\n1,2,3\n1,2,3");
                        alglib.read_csv(csv_name, ',', alglib.CSV_DEFAULT, out arr);
                        System.IO.File.Delete(csv_name);
                        _TestResult = false;
                    }
                    catch
                    { }

                    // empty file
                    try
                    {
                        double[,] arr;
                        System.IO.File.WriteAllText(csv_name, "");
                        alglib.read_csv(csv_name, '\t', alglib.CSV_DEFAULT, out arr);
                        System.IO.File.Delete(csv_name);
                        _TestResult = _TestResult && arr.GetLength(0) == 0 && arr.GetLength(1) == 0;
                    }
                    catch
                    { _TestResult = false; }

                    // one row with header, tab separator
                    try
                    {
                        double[,] arr;
                        System.IO.File.WriteAllText(csv_name, "a\tb\tc\n");
                        alglib.read_csv(csv_name, '\t', alglib.CSV_SKIP_HEADERS, out arr);
                        System.IO.File.Delete(csv_name);
                        _TestResult = _TestResult && arr.GetLength(0) == 0 && arr.GetLength(1) == 0;
                    }
                    catch
                    { _TestResult = false; }

                    // no header, comma-separated, full stop as decimal point
                    try
                    {
                        double[,] arr;
                        System.IO.File.WriteAllText(csv_name, "1.5,2,3.25\n4,5,6");
                        alglib.read_csv(csv_name, ',', alglib.CSV_DEFAULT, out arr);
                        System.IO.File.Delete(csv_name);
                        _TestResult = _TestResult && alglib.ap.format(arr, 2) == "{{1.50,2.00,3.25},{4.00,5.00,6.00}}";
                    }
                    catch
                    { _TestResult = false; }

                    // header, tab-separated, mixed use of comma and full stop as decimal points
                    try
                    {
                        double[,] arr;
                        System.IO.File.WriteAllText(csv_name, "a\tb\tc\n1.5\t2\t3,25\n4\t5.25\t6,1\n");
                        alglib.read_csv(csv_name, '\t', alglib.CSV_SKIP_HEADERS, out arr);
                        System.IO.File.Delete(csv_name);
                        _TestResult = _TestResult && alglib.ap.format(arr, 2) == "{{1.50,2.00,3.25},{4.00,5.25,6.10}}";
                    }
                    catch
                    { _TestResult = false; }

                    // header, tab-separated, fixed/exponential, spaces, mixed use of comma and full stop as decimal points
                    try
                    {
                        double[,] arr;
                        System.IO.File.WriteAllText(csv_name, " a\t b \tc\n1,1\t 2.9\t -3.5  \n  1.1E1  \t 2.0E-1 \t-3E+1 \n+1  \t -2\t 3.    \n.1\t-.2\t+.3\n");
                        alglib.read_csv(csv_name, '\t', alglib.CSV_SKIP_HEADERS, out arr);
                        System.IO.File.Delete(csv_name);
                        _TestResult = _TestResult && alglib.ap.format(arr, 2) == "{{1.10,2.90,-3.50},{11.00,0.20,-30.00},{1.00,-2.00,3.00},{0.10,-0.20,0.30}}";
                    }
                    catch
                    { _TestResult = false; }
                }
                catch
                {
                    _TestResult = false;
                }

                //
                // Report
                //
                System.Console.WriteLine("* CSV support                " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }

            //////////////////////////////////
            // Test issues from Mantis
            //////
            System.Console.WriteLine("Testing issies from Mantis:");


            //
            // Task #594 (http://bugs.alglib.net/view.php?id=594) - additional
            // test for correctness of copying of objects. When we copy ALGLIB
            // object, indenendent new copy is created.
            //
            {
                //
                // First, test copying of alglib.multilayerperceptron, which
                // is an "opaque object".
                //
                // Test copy constructors:
                // * copy object with make_copy()
                // * process vector with original network
                // * randomize original network
                // * process vector with copied networks and compare
                //
                alglib.multilayerperceptron net0, net1;
                double[] x  = new double[] { 1, 2 };
                double[] y0 = new double[] { 0, 0 };
                double[] y1 = new double[] { 0, 0 };
                double[] y2 = new double[] { 0, 0 };
                _TestResult = true;
                alglib.mlpcreate0(2, 2, out net0);
                alglib.mlpprocess(net0, x, ref y0);
                net1 = (alglib.multilayerperceptron)net0.make_copy();
                alglib.mlprandomize(net0);
                alglib.mlpprocess(net1, x, ref y1);
                _TestResult = _TestResult && (Math.Abs(y0[0] - y1[0]) < 1.0E-9) && (Math.Abs(y0[1] - y1[1]) < 1.0E-9);

                //
                // Then, test correctness of copying "records", i.e.
                // objects with publicly visible fields.
                //
                alglib.xdebugrecord1 r0, r1;
                alglib.xdebuginitrecord1(out r0);
                r1          = (alglib.xdebugrecord1)r0.make_copy();
                _TestResult = _TestResult && (r1.i == r0.i);
                _TestResult = _TestResult && (r1.c == r0.c);

                _TestResult = _TestResult && (r1.a.Length == 2);
                _TestResult = _TestResult && (r0.a.Length == 2);
                _TestResult = _TestResult && (r1.a != r0.a);
                _TestResult = _TestResult && (r1.a[0] == r0.a[0]);
                _TestResult = _TestResult && (r1.a[1] == r0.a[1]);

                //
                // Test result
                //
                System.Console.WriteLine("* issue 594                  " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
        }
        catch
        {
            System.Console.WriteLine("Unhandled exception was raised!");
            System.Environment.ExitCode = 1;
            return;
        }

        //
        // Test below creates instance of MemoryLeaksTest object.
        //
        // This object is descendant of CriticalFinalizerObject class,
        // which guarantees that it will be finalized AFTER all other
        // ALGLIB objects which hold pointers to unmanaged memory.
        //
        // Tests for memory leaks are done within object's destructor.
        //
        MemoryLeaksTest _test_object = new MemoryLeaksTest();

        if (!_TotalResult)
        {
            System.Environment.ExitCode = 1;
        }
    }
コード例 #2
0
    public static void Main(string[] args)
    {
        bool _TotalResult = true;
        bool _TestResult;
        int  _spoil_scenario;

        System.Console.WriteLine("x-tests. Please wait...");
        alglib.alloc_counter_activate();
        System.Console.WriteLine("Allocation counter activated...");
        try
        {
            const int max1d = 70;
            const int max2d = 40;

            System.Console.WriteLine("Basic tests:");
            {
                // deallocateimmediately()
                alglib.minlbfgsstate s;
                double[]             x = new double[100];
                long cnt0, cnt1;
                cnt0 = alglib.alloc_counter();
                alglib.minlbfgscreate(x.Length, 10, x, out s);
                alglib.deallocateimmediately(ref s);
                cnt1        = alglib.alloc_counter();
                _TestResult = cnt1 <= cnt0;
                System.Console.WriteLine("* deallocateimmediately()    " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // boolean 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int n, i, cnt;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    bool[] arr0 = new bool[n];
                    bool[] arr1 = new bool[n];
                    bool[] arr2 = new bool[n];
                    bool[] arr3 = null;
                    cnt = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i] = alglib.math.randomreal() > 0.5;
                        arr1[i] = arr0[i];
                        arr2[i] = arr0[i];
                        if (arr0[i])
                        {
                            cnt++;
                        }
                    }
                    _TestResult = _TestResult && (alglib.xdebugb1count(arr0) == cnt);
                    alglib.xdebugb1not(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (arr1[i] == !arr0[i]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugb1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugb1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (arr3[i] == (i % 2 == 0));
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* boolean 1D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // integer 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int n, i, sum;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    int[] arr0 = new int[n];
                    int[] arr1 = new int[n];
                    int[] arr2 = new int[n];
                    int[] arr3 = null;
                    sum = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i] = alglib.math.randominteger(10);
                        arr1[i] = arr0[i];
                        arr2[i] = arr0[i];
                        sum    += arr0[i];
                    }
                    _TestResult = _TestResult && (alglib.xdebugi1sum(arr0) == sum);
                    alglib.xdebugi1neg(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (arr1[i] == -arr0[i]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugi1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugi1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            if (i % 2 == 0)
                            {
                                _TestResult = _TestResult && (arr3[i] == i);
                            }
                            else
                            {
                                _TestResult = _TestResult && (arr3[i] == 0);
                            }
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* integer 1D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // real 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int    n, i;
                double sum;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    double[] arr0 = new double[n];
                    double[] arr1 = new double[n];
                    double[] arr2 = new double[n];
                    double[] arr3 = null;
                    sum = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i] = alglib.math.randomreal() - 0.5;
                        arr1[i] = arr0[i];
                        arr2[i] = arr0[i];
                        sum    += arr0[i];
                    }
                    _TestResult = _TestResult && (Math.Abs(alglib.xdebugr1sum(arr0) - sum) < 1.0E-10);
                    alglib.xdebugr1neg(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (Math.Abs(arr1[i] + arr0[i]) < 1.0E-10);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugr1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugr1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            if (i % 2 == 0)
                            {
                                _TestResult = _TestResult && (arr3[i] == i * 0.25);
                            }
                            else
                            {
                                _TestResult = _TestResult && (arr3[i] == 0);
                            }
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* real 1D arrays             " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // complex 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int            n, i;
                alglib.complex sum;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    alglib.complex[] arr0 = new alglib.complex[n];
                    alglib.complex[] arr1 = new alglib.complex[n];
                    alglib.complex[] arr2 = new alglib.complex[n];
                    alglib.complex[] arr3 = null;
                    sum = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i].x = alglib.math.randomreal() - 0.5;
                        arr0[i].y = alglib.math.randomreal() - 0.5;
                        arr1[i]   = arr0[i];
                        arr2[i]   = arr0[i];
                        sum      += arr0[i];
                    }
                    _TestResult = _TestResult && (alglib.math.abscomplex(alglib.xdebugc1sum(arr0) - sum) < 1.0E-10);
                    alglib.xdebugc1neg(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (alglib.math.abscomplex(arr1[i] + arr0[i]) < 1.0E-10);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugc1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugc1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            if (i % 2 == 0)
                            {
                                _TestResult = _TestResult && (arr3[i].x == i * 0.250);
                                _TestResult = _TestResult && (arr3[i].y == i * 0.125);
                            }
                            else
                            {
                                _TestResult = _TestResult && (arr3[i] == 0);
                            }
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* complex 1D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // boolean 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int m, n, i, j, cnt;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        bool[,] arr0 = new bool[m, n];
                        bool[,] arr1 = new bool[m, n];
                        bool[,] arr2 = new bool[m, n];
                        bool[,] arr3 = null;
                        cnt          = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j] = alglib.math.randomreal() > 0.5;
                                arr1[i, j] = arr0[i, j];
                                arr2[i, j] = arr0[i, j];
                                if (arr0[i, j])
                                {
                                    cnt++;
                                }
                            }
                        }
                        _TestResult = _TestResult && (alglib.xdebugb2count(arr0) == cnt);
                        alglib.xdebugb2not(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == !arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugb2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugb2outsin(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr3[i, j] == (Math.Sin(3 * i + 5 * j) > 0));
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* boolean 2D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // integer 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int m, n, i, j;
                int sum;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        int[,] arr0 = new int[m, n];
                        int[,] arr1 = new int[m, n];
                        int[,] arr2 = new int[m, n];
                        int[,] arr3 = null;
                        sum         = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j] = alglib.math.randominteger(10);
                                arr1[i, j] = arr0[i, j];
                                arr2[i, j] = arr0[i, j];
                                sum       += arr0[i, j];
                            }
                        }
                        _TestResult = _TestResult && (alglib.xdebugi2sum(arr0) == sum);
                        alglib.xdebugi2neg(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == -arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugi2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugi2outsin(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr3[i, j] == System.Math.Sign(Math.Sin(3 * i + 5 * j)));
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* integer 2D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // real 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int    m, n, i, j;
                double sum;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        double[,] arr0 = new double[m, n];
                        double[,] arr1 = new double[m, n];
                        double[,] arr2 = new double[m, n];
                        double[,] arr3 = null;
                        sum            = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j] = alglib.math.randomreal() - 0.5;
                                arr1[i, j] = arr0[i, j];
                                arr2[i, j] = arr0[i, j];
                                sum       += arr0[i, j];
                            }
                        }
                        _TestResult = _TestResult && (System.Math.Abs(alglib.xdebugr2sum(arr0) - sum) < 1.0E-10);
                        alglib.xdebugr2neg(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == -arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugr2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugr2outsin(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (System.Math.Abs(arr3[i, j] - Math.Sin(3 * i + 5 * j)) < 1E-10);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* real 2D arrays             " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // real 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int            m, n, i, j;
                alglib.complex sum;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        alglib.complex[,] arr0 = new alglib.complex[m, n];
                        alglib.complex[,] arr1 = new alglib.complex[m, n];
                        alglib.complex[,] arr2 = new alglib.complex[m, n];
                        alglib.complex[,] arr3 = null;
                        sum = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j].x = alglib.math.randomreal() - 0.5;
                                arr0[i, j].y = alglib.math.randomreal() - 0.5;
                                arr1[i, j]   = arr0[i, j];
                                arr2[i, j]   = arr0[i, j];
                                sum         += arr0[i, j];
                            }
                        }
                        _TestResult = _TestResult && (alglib.math.abscomplex(alglib.xdebugc2sum(arr0) - sum) < 1.0E-10);
                        alglib.xdebugc2neg(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == -arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugc2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugc2outsincos(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (System.Math.Abs(arr3[i, j].x - Math.Sin(3 * i + 5 * j)) < 1E-10);
                                    _TestResult = _TestResult && (System.Math.Abs(arr3[i, j].y - Math.Cos(3 * i + 5 * j)) < 1E-10);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* complex 2D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // "biased product / sum" test
                int    m, n, i, j;
                double sum;
                _TestResult = true;
                for (n = 1; n <= max2d; n++)
                {
                    for (m = 1; m <= max2d; m++)
                    {
                        // proceed to testing
                        double[,] a = new double[m, n];
                        double[,] b = new double[m, n];
                        bool[,]   c = new bool[m, n];
                        sum         = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                a[i, j] = alglib.math.randomreal() - 0.5;
                                b[i, j] = alglib.math.randomreal() - 0.5;
                                c[i, j] = alglib.math.randomreal() > 0.5;
                                if (c[i, j])
                                {
                                    sum += a[i, j] * (1 + b[i, j]);
                                }
                            }
                        }
                        _TestResult = _TestResult && (Math.Abs(alglib.xdebugmaskedbiasedproductsum(m, n, a, b, c) - sum) < 1.0E-10);
                    }
                }
                System.Console.WriteLine("* multiple arrays            " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
        }
        catch
        {
            System.Console.WriteLine("Unhandled exception was raised!");
            System.Environment.ExitCode = 1;
            return;
        }

        //
        // Test below creates instance of MemoryLeaksTest object.
        //
        // This object is descendant of CriticalFinalizerObject class,
        // which guarantees that it will be finalized AFTER all other
        // ALGLIB objects which hold pointers to unmanaged memory.
        //
        // Tests for memory leaks are done within object's destructor.
        //
        MemoryLeaksTest _test_object = new MemoryLeaksTest();

        if (!_TotalResult)
        {
            System.Environment.ExitCode = 1;
        }
    }
コード例 #3
0
ファイル: test_x.cs プロジェクト: KBrus/nton-rbm
 public static void Main(string[] args)
 {
     bool _TotalResult = true;
     bool _TestResult;
     int _spoil_scenario;
     System.Console.WriteLine("x-tests. Please wait...");
     alglib.alloc_counter_activate();
     System.Console.WriteLine("Allocation counter activated...");
     try
     {
         const int max1d = 70;
         const int max2d = 40;
         
         System.Console.WriteLine("Basic tests:");
         {
             // deallocateimmediately()
             alglib.minlbfgsstate s;
             double[] x = new double[100];
             long cnt0, cnt1;
             cnt0 = alglib.alloc_counter();
             alglib.minlbfgscreate(x.Length, 10, x, out s);
             alglib.deallocateimmediately(ref s);
             cnt1 = alglib.alloc_counter();
             _TestResult = cnt1<=cnt0;
             System.Console.WriteLine("* deallocateimmediately()    "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
         {
             // boolean 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
             int n, i, cnt;
             _TestResult = true;
             for(n=0; n<=max1d; n++)
             {
                 bool[] arr0 = new bool[n];
                 bool[] arr1 = new bool[n];
                 bool[] arr2 = new bool[n];
                 bool[] arr3 = null;
                 cnt = 0;
                 for(i=0; i<n; i++)
                 {
                     arr0[i] = alglib.math.randomreal()>0.5;
                     arr1[i] = arr0[i];
                     arr2[i] = arr0[i];
                     if( arr0[i] )
                         cnt++;
                 }
                 _TestResult = _TestResult && (alglib.xdebugb1count(arr0)==cnt);
                 alglib.xdebugb1not(ref arr1);
                 if( alglib.ap.len(arr1)==n )
                 {
                     for(i=0; i<n; i++)
                         _TestResult = _TestResult && (arr1[i]==!arr0[i]);
                 }
                 else
                     _TestResult = false;
                 alglib.xdebugb1appendcopy(ref arr2);
                 if( alglib.ap.len(arr2)==2*n )
                 {
                     for(i=0; i<2*n; i++)
                         _TestResult = _TestResult && (arr2[i]==arr0[i%n]);
                 }
                 else
                     _TestResult = false;
                 alglib.xdebugb1outeven(n, out arr3);
                 if( alglib.ap.len(arr3)==n )
                 {
                     for(i=0; i<n; i++)
                         _TestResult = _TestResult && (arr3[i]==(i%2==0));
                 }
                 else
                     _TestResult = false;
             }
             System.Console.WriteLine("* boolean 1D arrays          "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
         {
             // integer 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
             int n, i, sum;
             _TestResult = true;
             for(n=0; n<=max1d; n++)
             {
                 int[] arr0 = new int[n];
                 int[] arr1 = new int[n];
                 int[] arr2 = new int[n];
                 int[] arr3 = null;
                 sum = 0;
                 for(i=0; i<n; i++)
                 {
                     arr0[i] = alglib.math.randominteger(10);
                     arr1[i] = arr0[i];
                     arr2[i] = arr0[i];
                     sum+=arr0[i];
                 }
                 _TestResult = _TestResult && (alglib.xdebugi1sum(arr0)==sum);
                 alglib.xdebugi1neg(ref arr1);
                 if( alglib.ap.len(arr1)==n )
                 {
                     for(i=0; i<n; i++)
                         _TestResult = _TestResult && (arr1[i]==-arr0[i]);
                 }
                 else
                     _TestResult = false;
                 alglib.xdebugi1appendcopy(ref arr2);
                 if( alglib.ap.len(arr2)==2*n )
                 {
                     for(i=0; i<2*n; i++)
                         _TestResult = _TestResult && (arr2[i]==arr0[i%n]);
                 }
                 else
                     _TestResult = false;
                 alglib.xdebugi1outeven(n,out arr3);
                 if( alglib.ap.len(arr3)==n )
                 {
                     for(i=0; i<n; i++)
                         if( i%2==0 )
                             _TestResult = _TestResult && (arr3[i]==i);
                         else
                             _TestResult = _TestResult && (arr3[i]==0);
                 }
                 else
                     _TestResult = false;
             }
             System.Console.WriteLine("* integer 1D arrays          "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
         {
             // real 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
             int n, i;
             double sum;
             _TestResult = true;
             for(n=0; n<=max1d; n++)
             {
                 double[] arr0 = new double[n];
                 double[] arr1 = new double[n];
                 double[] arr2 = new double[n];
                 double[] arr3 = null;
                 sum = 0;
                 for(i=0; i<n; i++)
                 {
                     arr0[i] = alglib.math.randomreal()-0.5;
                     arr1[i] = arr0[i];
                     arr2[i] = arr0[i];
                     sum+=arr0[i];
                 }
                 _TestResult = _TestResult && (Math.Abs(alglib.xdebugr1sum(arr0)-sum)<1.0E-10);
                 alglib.xdebugr1neg(ref arr1);
                 if( alglib.ap.len(arr1)==n )
                 {
                     for(i=0; i<n; i++)
                         _TestResult = _TestResult && (Math.Abs(arr1[i]+arr0[i])<1.0E-10);
                 }
                 else
                     _TestResult = false;
                 alglib.xdebugr1appendcopy(ref arr2);
                 if( alglib.ap.len(arr2)==2*n )
                 {
                     for(i=0; i<2*n; i++)
                         _TestResult = _TestResult && (arr2[i]==arr0[i%n]);
                 }
                 else
                     _TestResult = false;
                 alglib.xdebugr1outeven(n,out arr3);
                 if( alglib.ap.len(arr3)==n )
                 {
                     for(i=0; i<n; i++)
                         if( i%2==0 )
                             _TestResult = _TestResult && (arr3[i]==i*0.25);
                         else
                             _TestResult = _TestResult && (arr3[i]==0);
                 }
                 else
                     _TestResult = false;
             }
             System.Console.WriteLine("* real 1D arrays             "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
         {
             // complex 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
             int n, i;
             alglib.complex sum;
             _TestResult = true;
             for(n=0; n<=max1d; n++)
             {
                 alglib.complex[] arr0 = new alglib.complex[n];
                 alglib.complex[] arr1 = new alglib.complex[n];
                 alglib.complex[] arr2 = new alglib.complex[n];
                 alglib.complex[] arr3 = null;
                 sum = 0;
                 for(i=0; i<n; i++)
                 {
                     arr0[i].x = alglib.math.randomreal()-0.5;
                     arr0[i].y = alglib.math.randomreal()-0.5;
                     arr1[i] = arr0[i];
                     arr2[i] = arr0[i];
                     sum+=arr0[i];
                 }
                 _TestResult = _TestResult && (alglib.math.abscomplex(alglib.xdebugc1sum(arr0)-sum)<1.0E-10);
                 alglib.xdebugc1neg(ref arr1);
                 if( alglib.ap.len(arr1)==n )
                 {
                     for(i=0; i<n; i++)
                         _TestResult = _TestResult && (alglib.math.abscomplex(arr1[i]+arr0[i])<1.0E-10);
                 }
                 else
                     _TestResult = false;
                 alglib.xdebugc1appendcopy(ref arr2);
                 if( alglib.ap.len(arr2)==2*n )
                 {
                     for(i=0; i<2*n; i++)
                         _TestResult = _TestResult && (arr2[i]==arr0[i%n]);
                 }
                 else
                     _TestResult = false;
                 alglib.xdebugc1outeven(n,out arr3);
                 if( alglib.ap.len(arr3)==n )
                 {
                     for(i=0; i<n; i++)
                         if( i%2==0 )
                         {
                             _TestResult = _TestResult && (arr3[i].x==i*0.250);
                             _TestResult = _TestResult && (arr3[i].y==i*0.125);
                         }
                         else
                             _TestResult = _TestResult && (arr3[i]==0);
                 }
                 else
                     _TestResult = false;
             }
             System.Console.WriteLine("* complex 1D arrays          "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
         {
             // boolean 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
             int m, n, i, j, cnt;
             _TestResult = true;
             for(n=0; n<=max2d; n++)
                 for(m=0; m<=max2d; m++)
                 {
                     // skip situations when n*m==0, but n!=0 or m!=0
                     if( n*m==0 && (n!=0 || m!=0) )
                         continue;
                     
                     // proceed to testing
                     bool[,] arr0 = new bool[m,n];
                     bool[,] arr1 = new bool[m,n];
                     bool[,] arr2 = new bool[m,n];
                     bool[,] arr3 = null;
                     cnt = 0;
                     for(i=0; i<m; i++)
                         for(j=0; j<n; j++)
                         {
                             arr0[i,j] = alglib.math.randomreal()>0.5;
                             arr1[i,j] = arr0[i,j];
                             arr2[i,j] = arr0[i,j];
                             if( arr0[i,j] )
                                 cnt++;
                         }
                     _TestResult = _TestResult && (alglib.xdebugb2count(arr0)==cnt);
                     alglib.xdebugb2not(ref arr1);
                     if( alglib.ap.rows(arr1)==m && alglib.ap.cols(arr1)==n )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr1[i,j]==!arr0[i,j]);
                     }
                     else
                         _TestResult = false;
                     alglib.xdebugb2transpose(ref arr2);
                     if( alglib.ap.rows(arr2)==n && alglib.ap.cols(arr2)==m )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr2[j,i]==arr0[i,j]);
                     }
                     else
                         _TestResult = false;
                     alglib.xdebugb2outsin(m, n, out arr3);
                     if( alglib.ap.rows(arr3)==m && alglib.ap.cols(arr3)==n )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr3[i,j]==(Math.Sin(3*i+5*j)>0));
                     }
                     else
                         _TestResult = false;
                 }
             System.Console.WriteLine("* boolean 2D arrays          "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
         {
             // integer 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
             int m, n, i, j;
             int sum;
             _TestResult = true;
             for(n=0; n<=max2d; n++)
                 for(m=0; m<=max2d; m++)
                 {
                     // skip situations when n*m==0, but n!=0 or m!=0
                     if( n*m==0 && (n!=0 || m!=0) )
                         continue;
                     
                     // proceed to testing
                     int[,] arr0 = new int[m,n];
                     int[,] arr1 = new int[m,n];
                     int[,] arr2 = new int[m,n];
                     int[,] arr3 = null;
                     sum = 0;
                     for(i=0; i<m; i++)
                         for(j=0; j<n; j++)
                         {
                             arr0[i,j] = alglib.math.randominteger(10);
                             arr1[i,j] = arr0[i,j];
                             arr2[i,j] = arr0[i,j];
                             sum += arr0[i,j];
                         }
                     _TestResult = _TestResult && (alglib.xdebugi2sum(arr0)==sum);
                     alglib.xdebugi2neg(ref arr1);
                     if( alglib.ap.rows(arr1)==m && alglib.ap.cols(arr1)==n )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr1[i,j]==-arr0[i,j]);
                     }
                     else
                         _TestResult = false;
                     alglib.xdebugi2transpose(ref arr2);
                     if( alglib.ap.rows(arr2)==n && alglib.ap.cols(arr2)==m )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr2[j,i]==arr0[i,j]);
                     }
                     else
                         _TestResult = false;
                     alglib.xdebugi2outsin(m, n, out arr3);
                     if( alglib.ap.rows(arr3)==m && alglib.ap.cols(arr3)==n )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr3[i,j]==System.Math.Sign(Math.Sin(3*i+5*j)));
                     }
                     else
                         _TestResult = false;
                 }
             System.Console.WriteLine("* integer 2D arrays          "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
         {
             // real 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
             int m, n, i, j;
             double sum;
             _TestResult = true;
             for(n=0; n<=max2d; n++)
                 for(m=0; m<=max2d; m++)
                 {
                     // skip situations when n*m==0, but n!=0 or m!=0
                     if( n*m==0 && (n!=0 || m!=0) )
                         continue;
                     
                     // proceed to testing
                     double[,] arr0 = new double[m,n];
                     double[,] arr1 = new double[m,n];
                     double[,] arr2 = new double[m,n];
                     double[,] arr3 = null;
                     sum = 0;
                     for(i=0; i<m; i++)
                         for(j=0; j<n; j++)
                         {
                             arr0[i,j] = alglib.math.randomreal()-0.5;
                             arr1[i,j] = arr0[i,j];
                             arr2[i,j] = arr0[i,j];
                             sum += arr0[i,j];
                         }
                     _TestResult = _TestResult && (System.Math.Abs(alglib.xdebugr2sum(arr0)-sum)<1.0E-10);
                     alglib.xdebugr2neg(ref arr1);
                     if( alglib.ap.rows(arr1)==m && alglib.ap.cols(arr1)==n )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr1[i,j]==-arr0[i,j]);
                     }
                     else
                         _TestResult = false;
                     alglib.xdebugr2transpose(ref arr2);
                     if( alglib.ap.rows(arr2)==n && alglib.ap.cols(arr2)==m )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr2[j,i]==arr0[i,j]);
                     }
                     else
                         _TestResult = false;
                     alglib.xdebugr2outsin(m, n, out arr3);
                     if( alglib.ap.rows(arr3)==m && alglib.ap.cols(arr3)==n )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (System.Math.Abs(arr3[i,j]-Math.Sin(3*i+5*j))<1E-10);
                     }
                     else
                         _TestResult = false;
                 }
             System.Console.WriteLine("* real 2D arrays             "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
         {
             // real 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
             int m, n, i, j;
             alglib.complex sum;
             _TestResult = true;
             for(n=0; n<=max2d; n++)
                 for(m=0; m<=max2d; m++)
                 {
                     // skip situations when n*m==0, but n!=0 or m!=0
                     if( n*m==0 && (n!=0 || m!=0) )
                         continue;
                     
                     // proceed to testing
                     alglib.complex[,] arr0 = new alglib.complex[m,n];
                     alglib.complex[,] arr1 = new alglib.complex[m,n];
                     alglib.complex[,] arr2 = new alglib.complex[m,n];
                     alglib.complex[,] arr3 = null;
                     sum = 0;
                     for(i=0; i<m; i++)
                         for(j=0; j<n; j++)
                         {
                             arr0[i,j].x = alglib.math.randomreal()-0.5;
                             arr0[i,j].y = alglib.math.randomreal()-0.5;
                             arr1[i,j] = arr0[i,j];
                             arr2[i,j] = arr0[i,j];
                             sum += arr0[i,j];
                         }
                     _TestResult = _TestResult && (alglib.math.abscomplex(alglib.xdebugc2sum(arr0)-sum)<1.0E-10);
                     alglib.xdebugc2neg(ref arr1);
                     if( alglib.ap.rows(arr1)==m && alglib.ap.cols(arr1)==n )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr1[i,j]==-arr0[i,j]);
                     }
                     else
                         _TestResult = false;
                     alglib.xdebugc2transpose(ref arr2);
                     if( alglib.ap.rows(arr2)==n && alglib.ap.cols(arr2)==m )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                                 _TestResult = _TestResult && (arr2[j,i]==arr0[i,j]);
                     }
                     else
                         _TestResult = false;
                     alglib.xdebugc2outsincos(m, n, out arr3);
                     if( alglib.ap.rows(arr3)==m && alglib.ap.cols(arr3)==n )
                     {
                         for(i=0; i<m; i++)
                             for(j=0; j<n; j++)
                             {
                                 _TestResult = _TestResult && (System.Math.Abs(arr3[i,j].x-Math.Sin(3*i+5*j))<1E-10);
                                 _TestResult = _TestResult && (System.Math.Abs(arr3[i,j].y-Math.Cos(3*i+5*j))<1E-10);
                             }
                     }
                     else
                         _TestResult = false;
                 }
             System.Console.WriteLine("* complex 2D arrays          "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
         {
             // "biased product / sum" test
             int m, n, i, j;
             double sum;
             _TestResult = true;
             for(n=1; n<=max2d; n++)
                 for(m=1; m<=max2d; m++)
                 {
                     // proceed to testing
                     double[,] a = new double[m,n];
                     double[,] b = new double[m,n];
                     bool[,]   c = new bool[m,n];
                     sum = 0;
                     for(i=0; i<m; i++)
                         for(j=0; j<n; j++)
                         {
                             a[i,j] = alglib.math.randomreal()-0.5;
                             b[i,j] = alglib.math.randomreal()-0.5;
                             c[i,j] = alglib.math.randomreal()>0.5;
                             if( c[i,j] )
                                 sum += a[i,j]*(1+b[i,j]);
                         }
                     _TestResult = _TestResult && (Math.Abs(alglib.xdebugmaskedbiasedproductsum(m,n,a,b,c)-sum)<1.0E-10);
                 }
             System.Console.WriteLine("* multiple arrays            "+(_TestResult ? " OK" : " FAILED"));
             _TotalResult = _TotalResult && _TestResult;
         }
     }
     catch
     {
         System.Console.WriteLine("Unhandled exception was raised!");
         System.Environment.ExitCode = 1;
         return;
     }
     
     //
     // Test below creates instance of MemoryLeaksTest object.
     //
     // This object is descendant of CriticalFinalizerObject class,
     // which guarantees that it will be finalized AFTER all other
     // ALGLIB objects which hold pointers to unmanaged memory.
     //
     // Tests for memory leaks are done within object's destructor.
     //
     MemoryLeaksTest _test_object = new MemoryLeaksTest();
     if( !_TotalResult )
         System.Environment.ExitCode = 1;
 }
コード例 #4
0
    public static void Main(string[] args)
    {
        bool _TotalResult = true;
        bool _TestResult;
        int  _spoil_scenario;

        System.Console.WriteLine("x-tests. Please wait...");
        alglib.alloc_counter_activate();
        System.Console.WriteLine("Allocation counter activated...");
        try
        {
            const int max1d = 70;
            const int max2d = 40;

            System.Console.WriteLine("Basic tests:");
            {
                // deallocateimmediately()
                alglib.minlbfgsstate s;
                double[]             x = new double[100];
                long cnt0, cnt1;
                cnt0 = alglib.alloc_counter();
                alglib.minlbfgscreate(x.Length, 10, x, out s);
                alglib.deallocateimmediately(ref s);
                cnt1        = alglib.alloc_counter();
                _TestResult = cnt1 <= cnt0;
                System.Console.WriteLine("* deallocateimmediately()    " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // boolean 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int n, i, cnt;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    bool[] arr0 = new bool[n];
                    bool[] arr1 = new bool[n];
                    bool[] arr2 = new bool[n];
                    bool[] arr3 = null;
                    cnt = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i] = alglib.math.randomreal() > 0.5;
                        arr1[i] = arr0[i];
                        arr2[i] = arr0[i];
                        if (arr0[i])
                        {
                            cnt++;
                        }
                    }
                    _TestResult = _TestResult && (alglib.xdebugb1count(arr0) == cnt);
                    alglib.xdebugb1not(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (arr1[i] == !arr0[i]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugb1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugb1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (arr3[i] == (i % 2 == 0));
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* boolean 1D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // integer 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int n, i, sum;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    int[] arr0 = new int[n];
                    int[] arr1 = new int[n];
                    int[] arr2 = new int[n];
                    int[] arr3 = null;
                    sum = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i] = alglib.math.randominteger(10);
                        arr1[i] = arr0[i];
                        arr2[i] = arr0[i];
                        sum    += arr0[i];
                    }
                    _TestResult = _TestResult && (alglib.xdebugi1sum(arr0) == sum);
                    alglib.xdebugi1neg(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (arr1[i] == -arr0[i]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugi1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugi1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            if (i % 2 == 0)
                            {
                                _TestResult = _TestResult && (arr3[i] == i);
                            }
                            else
                            {
                                _TestResult = _TestResult && (arr3[i] == 0);
                            }
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* integer 1D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // real 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int    n, i;
                double sum;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    double[] arr0 = new double[n];
                    double[] arr1 = new double[n];
                    double[] arr2 = new double[n];
                    double[] arr3 = null;
                    sum = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i] = alglib.math.randomreal() - 0.5;
                        arr1[i] = arr0[i];
                        arr2[i] = arr0[i];
                        sum    += arr0[i];
                    }
                    _TestResult = _TestResult && (Math.Abs(alglib.xdebugr1sum(arr0) - sum) < 1.0E-10);
                    alglib.xdebugr1neg(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (Math.Abs(arr1[i] + arr0[i]) < 1.0E-10);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugr1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugr1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            if (i % 2 == 0)
                            {
                                _TestResult = _TestResult && (arr3[i] == i * 0.25);
                            }
                            else
                            {
                                _TestResult = _TestResult && (arr3[i] == 0);
                            }
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* real 1D arrays             " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // complex 1D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int            n, i;
                alglib.complex sum;
                _TestResult = true;
                for (n = 0; n <= max1d; n++)
                {
                    alglib.complex[] arr0 = new alglib.complex[n];
                    alglib.complex[] arr1 = new alglib.complex[n];
                    alglib.complex[] arr2 = new alglib.complex[n];
                    alglib.complex[] arr3 = null;
                    sum = 0;
                    for (i = 0; i < n; i++)
                    {
                        arr0[i].x = alglib.math.randomreal() - 0.5;
                        arr0[i].y = alglib.math.randomreal() - 0.5;
                        arr1[i]   = arr0[i];
                        arr2[i]   = arr0[i];
                        sum      += arr0[i];
                    }
                    _TestResult = _TestResult && (alglib.math.abscomplex(alglib.xdebugc1sum(arr0) - sum) < 1.0E-10);
                    alglib.xdebugc1neg(ref arr1);
                    if (alglib.ap.len(arr1) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            _TestResult = _TestResult && (alglib.math.abscomplex(arr1[i] + arr0[i]) < 1.0E-10);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugc1appendcopy(ref arr2);
                    if (alglib.ap.len(arr2) == 2 * n)
                    {
                        for (i = 0; i < 2 * n; i++)
                        {
                            _TestResult = _TestResult && (arr2[i] == arr0[i % n]);
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                    alglib.xdebugc1outeven(n, out arr3);
                    if (alglib.ap.len(arr3) == n)
                    {
                        for (i = 0; i < n; i++)
                        {
                            if (i % 2 == 0)
                            {
                                _TestResult = _TestResult && (arr3[i].x == i * 0.250);
                                _TestResult = _TestResult && (arr3[i].y == i * 0.125);
                            }
                            else
                            {
                                _TestResult = _TestResult && (arr3[i] == 0);
                            }
                        }
                    }
                    else
                    {
                        _TestResult = false;
                    }
                }
                System.Console.WriteLine("* complex 1D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // boolean 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int m, n, i, j, cnt;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        bool[,] arr0 = new bool[m, n];
                        bool[,] arr1 = new bool[m, n];
                        bool[,] arr2 = new bool[m, n];
                        bool[,] arr3 = null;
                        cnt          = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j] = alglib.math.randomreal() > 0.5;
                                arr1[i, j] = arr0[i, j];
                                arr2[i, j] = arr0[i, j];
                                if (arr0[i, j])
                                {
                                    cnt++;
                                }
                            }
                        }
                        _TestResult = _TestResult && (alglib.xdebugb2count(arr0) == cnt);
                        alglib.xdebugb2not(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == !arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugb2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugb2outsin(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr3[i, j] == (Math.Sin(3 * i + 5 * j) > 0));
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* boolean 2D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // integer 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int m, n, i, j;
                int sum;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        int[,] arr0 = new int[m, n];
                        int[,] arr1 = new int[m, n];
                        int[,] arr2 = new int[m, n];
                        int[,] arr3 = null;
                        sum         = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j] = alglib.math.randominteger(10);
                                arr1[i, j] = arr0[i, j];
                                arr2[i, j] = arr0[i, j];
                                sum       += arr0[i, j];
                            }
                        }
                        _TestResult = _TestResult && (alglib.xdebugi2sum(arr0) == sum);
                        alglib.xdebugi2neg(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == -arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugi2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugi2outsin(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr3[i, j] == System.Math.Sign(Math.Sin(3 * i + 5 * j)));
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* integer 2D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // real 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int    m, n, i, j;
                double sum;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        double[,] arr0 = new double[m, n];
                        double[,] arr1 = new double[m, n];
                        double[,] arr2 = new double[m, n];
                        double[,] arr3 = null;
                        sum            = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j] = alglib.math.randomreal() - 0.5;
                                arr1[i, j] = arr0[i, j];
                                arr2[i, j] = arr0[i, j];
                                sum       += arr0[i, j];
                            }
                        }
                        _TestResult = _TestResult && (System.Math.Abs(alglib.xdebugr2sum(arr0) - sum) < 1.0E-10);
                        alglib.xdebugr2neg(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == -arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugr2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugr2outsin(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (System.Math.Abs(arr3[i, j] - Math.Sin(3 * i + 5 * j)) < 1E-10);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* real 2D arrays             " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // real 2D arrays (this test checks both interface and ref/out conventions used by ALGLIB)
                int            m, n, i, j;
                alglib.complex sum;
                _TestResult = true;
                for (n = 0; n <= max2d; n++)
                {
                    for (m = 0; m <= max2d; m++)
                    {
                        // skip situations when n*m==0, but n!=0 or m!=0
                        if (n * m == 0 && (n != 0 || m != 0))
                        {
                            continue;
                        }

                        // proceed to testing
                        alglib.complex[,] arr0 = new alglib.complex[m, n];
                        alglib.complex[,] arr1 = new alglib.complex[m, n];
                        alglib.complex[,] arr2 = new alglib.complex[m, n];
                        alglib.complex[,] arr3 = null;
                        sum = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                arr0[i, j].x = alglib.math.randomreal() - 0.5;
                                arr0[i, j].y = alglib.math.randomreal() - 0.5;
                                arr1[i, j]   = arr0[i, j];
                                arr2[i, j]   = arr0[i, j];
                                sum         += arr0[i, j];
                            }
                        }
                        _TestResult = _TestResult && (alglib.math.abscomplex(alglib.xdebugc2sum(arr0) - sum) < 1.0E-10);
                        alglib.xdebugc2neg(ref arr1);
                        if (alglib.ap.rows(arr1) == m && alglib.ap.cols(arr1) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr1[i, j] == -arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugc2transpose(ref arr2);
                        if (alglib.ap.rows(arr2) == n && alglib.ap.cols(arr2) == m)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (arr2[j, i] == arr0[i, j]);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                        alglib.xdebugc2outsincos(m, n, out arr3);
                        if (alglib.ap.rows(arr3) == m && alglib.ap.cols(arr3) == n)
                        {
                            for (i = 0; i < m; i++)
                            {
                                for (j = 0; j < n; j++)
                                {
                                    _TestResult = _TestResult && (System.Math.Abs(arr3[i, j].x - Math.Sin(3 * i + 5 * j)) < 1E-10);
                                    _TestResult = _TestResult && (System.Math.Abs(arr3[i, j].y - Math.Cos(3 * i + 5 * j)) < 1E-10);
                                }
                            }
                        }
                        else
                        {
                            _TestResult = false;
                        }
                    }
                }
                System.Console.WriteLine("* complex 2D arrays          " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
            {
                // "biased product / sum" test
                int    m, n, i, j;
                double sum;
                _TestResult = true;
                for (n = 1; n <= max2d; n++)
                {
                    for (m = 1; m <= max2d; m++)
                    {
                        // proceed to testing
                        double[,] a = new double[m, n];
                        double[,] b = new double[m, n];
                        bool[,]   c = new bool[m, n];
                        sum         = 0;
                        for (i = 0; i < m; i++)
                        {
                            for (j = 0; j < n; j++)
                            {
                                a[i, j] = alglib.math.randomreal() - 0.5;
                                b[i, j] = alglib.math.randomreal() - 0.5;
                                c[i, j] = alglib.math.randomreal() > 0.5;
                                if (c[i, j])
                                {
                                    sum += a[i, j] * (1 + b[i, j]);
                                }
                            }
                        }
                        _TestResult = _TestResult && (Math.Abs(alglib.xdebugmaskedbiasedproductsum(m, n, a, b, c) - sum) < 1.0E-10);
                    }
                }
                System.Console.WriteLine("* multiple arrays            " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }

            //////////////////////////////////
            // Test issues from Mantis
            //////
            System.Console.WriteLine("Testing issies from Mantis:");


            //
            // Task #594 (http://bugs.alglib.net/view.php?id=594) - additional
            // test for correctness of copying of objects. When we copy ALGLIB
            // object, indenendent new copy is created.
            //
            {
                //
                // First, test copying of alglib.multilayerperceptron, which
                // is an "opaque object".
                //
                // Test copy constructors:
                // * copy object with make_copy()
                // * process vector with original network
                // * randomize original network
                // * process vector with copied networks and compare
                //
                alglib.multilayerperceptron net0, net1;
                double[] x  = new double[] { 1, 2 };
                double[] y0 = new double[] { 0, 0 };
                double[] y1 = new double[] { 0, 0 };
                double[] y2 = new double[] { 0, 0 };
                _TestResult = true;
                alglib.mlpcreate0(2, 2, out net0);
                alglib.mlpprocess(net0, x, ref y0);
                net1 = (alglib.multilayerperceptron)net0.make_copy();
                alglib.mlprandomize(net0);
                alglib.mlpprocess(net1, x, ref y1);
                _TestResult = _TestResult && (Math.Abs(y0[0] - y1[0]) < 1.0E-9) && (Math.Abs(y0[1] - y1[1]) < 1.0E-9);

                //
                // Then, test correctness of copying "records", i.e.
                // objects with publicly visible fields.
                //
                alglib.xdebugrecord1 r0, r1;
                alglib.xdebuginitrecord1(out r0);
                r1          = (alglib.xdebugrecord1)r0.make_copy();
                _TestResult = _TestResult && (r1.i == r0.i);
                _TestResult = _TestResult && (r1.c == r0.c);

                _TestResult = _TestResult && (r1.a.Length == 2);
                _TestResult = _TestResult && (r0.a.Length == 2);
                _TestResult = _TestResult && (r1.a != r0.a);
                _TestResult = _TestResult && (r1.a[0] == r0.a[0]);
                _TestResult = _TestResult && (r1.a[1] == r0.a[1]);

                //
                // Test result
                //
                System.Console.WriteLine("* issue 594                  " + (_TestResult ? " OK" : " FAILED"));
                _TotalResult = _TotalResult && _TestResult;
            }
        }
        catch
        {
            System.Console.WriteLine("Unhandled exception was raised!");
            System.Environment.ExitCode = 1;
            return;
        }

        //
        // Test below creates instance of MemoryLeaksTest object.
        //
        // This object is descendant of CriticalFinalizerObject class,
        // which guarantees that it will be finalized AFTER all other
        // ALGLIB objects which hold pointers to unmanaged memory.
        //
        // Tests for memory leaks are done within object's destructor.
        //
        MemoryLeaksTest _test_object = new MemoryLeaksTest();

        if (!_TotalResult)
        {
            System.Environment.ExitCode = 1;
        }
    }