예제 #1
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;
        }