Example #1
0
        /// <summary>
        ///     [Thread-Unsafe] Get multiple normal distribution random values of <see cref="double"/>.
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public double[] NextNorm64(int count)
        {
            var half   = count / 2;
            var retval = NextFloat64(count);

            for (var i = 0; i < half; ++i)
            {
                var j   = i << 1; // 2 * i
                var x   = retval[j];
                var y   = retval[j + 1];
                var mag = NdMath.Sqrt(-2 * NdMath.Log(x));
                var ang = 2 * NdMath.PI <double>() * y;
                retval[j]     = mag * NdMath.Cos(ang);
                retval[j + 1] = mag * NdMath.Sin(ang);
            }

            if ((count & 1) == 1) // count % 2 == 1
            {
                var x = retval[count - 1];
                var y = NextFloat64();
                retval[count - 1] = NdMath.Sqrt(-2 * NdMath.Log(x)) * NdMath.Cos(2 * NdMath.PI <double>() * y);
            }

            return(retval);
        }
Example #2
0
        /// <summary>
        ///     [Thread-Unsafe] Get single normal distribution random value of <see cref="double"/>.
        /// </summary>
        /// <returns></returns>
        public double NextNorm64()
        {
            var x = NextFloat64();
            var y = NextFloat64();

            return(NdMath.Sqrt(-2 * NdMath.Log(x)) * NdMath.Cos(2 * NdMath.PI <double>() * y));
        }
Example #3
0
        /// <summary>
        ///     [Thread-Unsafe] Get single normal distribution random value of <see cref="float"/>.
        /// </summary>
        /// <returns></returns>
        public float NextNorm32()
        {
            var x = NextFloat32();
            var y = NextFloat32();

            return(NdMath.Sqrt(-2 * NdMath.Log(x)) * NdMath.Cos(2 * NdMath.PI <float>() * y));
        }
Example #4
0
 public void DecimalTest()
 {
     Assert.Equal(1m, NdMath.Exp(0m), 27);
     Assert.Equal(NdMath.E <decimal>(), NdMath.Exp(1m), 27);
     Assert.Equal(1.64872127070012814684865078781m, NdMath.Exp(0.5m), 27);
     Assert.Equal(4.48168907033806482260205546012m, NdMath.Exp(1.5m), 27);
     Assert.Equal(0.223130160148429828933280470764m, NdMath.Exp(-1.5m), 27);
 }
Example #5
0
        /// <summary>
        ///     [Pure] Returns the 2-D norm of all elements of <paramref name="ndArray"/>.
        /// </summary>
        /// <param name="ndArray"></param>
        /// <returns></returns>
        public static T Norm2 <T>(this INdArray <T> ndArray)
        {
            var len = ndArray.Shape.TotalLength;

            Guard.AssertOperation(len > 0, "ndArray has no elements.");

            var norm = ValueTrait.Zero <T>();

            for (var i = 0; i < len; ++i)
            {
                var element = ndArray.GetItem(i);
                norm = ValueTrait.Add(norm, ValueTrait.Multiply(element, element));
            }

            return(NdMath.Sqrt(norm));
        }
Example #6
0
        public static IEnumerable <object[]> FloatTestArgs()
        {
            object[] core(float x, float ans)
            => new object[]
            {
                x, ans
            };

            yield return(core(0, 1));

            yield return(core(1, NdMath.E <float>()));

            yield return(core(0.5f, 1.6487212707f));

            yield return(core(1.5f, 4.48168907034f));

            yield return(core(-1.5f, 0.22313016014f));
        }
Example #7
0
        /// <summary>
        ///     Generates npy header by this instance.
        /// </summary>
        /// <returns></returns>
        public byte[] GenerateHeader()
        {
            var headerText =
                "{"
                + $"'descr': '{NumpyType.Expression}', "
                + $"'fortran_order': {(FortranOrder ? "True" : "False")}, "
                + $"'shape': ({string.Join(", ", Shape)}{(Shape.Length <= 1 ? "," : "")}), "
                + "}";
            var header = Encoding.UTF8.GetBytes(headerText);

            var bufferLen =
                NdMath.Max(128, Align16(_HeaderMagicNumber.Length + 4 + header.Length + 1));
            var version        = bufferLen < 65536 ? (byte)1 : (byte)2;
            var headerDicAlign = _HeaderDicAligns[version];

            var buffer = new byte[bufferLen];

            buffer.AsSpan().Fill(0x20);
            Buffer.BlockCopy(_HeaderMagicNumber, 0, buffer, 0, _HeaderMagicNumber.Length);
            buffer[_MajorVersionAlign] = version;
            buffer[_MinorVersionAlign] = 0;
            switch (version)
            {
            case 1:
                LittleEndiannessBitConverter.Instance.TryWritePrimitive(buffer.AsSpan(_HeaderLenAlign),
                                                                        (ushort)(bufferLen - headerDicAlign));
                break;

            case 2:
                LittleEndiannessBitConverter.Instance.TryWritePrimitive(buffer.AsSpan(_HeaderLenAlign),
                                                                        (ushort)(bufferLen - headerDicAlign));
                break;
            }

            Buffer.BlockCopy(header, 0, buffer, headerDicAlign, header.Length);
            buffer[bufferLen - 1] = 0x0A;
            return(buffer);
        }
        /// <summary>
        ///     Creates new <see cref="T:NeodymiumDotNet.Random.MersenneTwisterGenerator" /> instance with seed array.
        /// </summary>
        /// <param name="seedArray"></param>
        public MersenneTwisterGenerator(IReadOnlyList <int> seedArray)
            : this(19650218)
        {
            var i = 1;
            var j = 0;
            var k = NdMath.Max(_N, seedArray.Count);

            for (; k > 0; --k)
            {
                var prev = _mt[i - 1];
                _mt[i] = (_mt[i] ^ ((prev ^ (prev >> 30)) * 1664525u)) + (uint)seedArray[j] + (uint)j;
                ++i;
                ++j;
                if (i >= _N)
                {
                    _mt[0] = _mt[_N - 1];
                    i      = 1;
                }
                if (j >= seedArray.Count)
                {
                    j = 0;
                }
            }

            for (k = _N - 1; k > 0; --k)
            {
                var prev = _mt[i - 1];
                _mt[i] = (_mt[i] ^ ((prev ^ (prev >> 30)) * 1566083941)) - (uint)i;
                ++i;
                if (i >= _N)
                {
                    _mt[0] = _mt[_N - 1];
                    i      = 1;
                }
            }

            _mt[0] = _UpperMask;
        }
Example #9
0
 public void FloatTest(float x, float ans)
 => Assert.Equal(ans, NdMath.Exp(x), 6);
 /// <summary>
 ///     Computes sample variance from all elements of the <paramref name="ndArray"/>.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="ndArray"></param>
 /// <returns></returns>
 public static T StdDev <T>(this INdArray <T> ndArray)
 => NdMath.Sqrt(ndArray.SampleVar());