/// <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; }