Beispiel #1
0
        /// <summary>
        /// 入力処理
        /// </summary>
        /// <param name="bytes"></param>
        private void input(byte[] bytes)
        {
            int offset  = 0;
            int version = BitConverter.ToInt32(bytes, offset);

            offset += 4;
            int hash = BitConverter.ToInt32(bytes, offset);

            offset += 4;
            int size = BitConverter.ToInt32(bytes, offset);

            offset      += 4;
            Architecture = System.Text.Encoding.UTF8.GetString(bytes, offset, size);
            offset      += size;

            System.Diagnostics.Debug.WriteLine(size);
            System.Diagnostics.Debug.WriteLine(Architecture);
            System.Diagnostics.Debug.WriteLine(offset);
            //end header

            featureTransformStart = offset;

            int header = BitConverter.ToInt32(bytes, offset);

            offset += 4;
            offset  = FeatureAffineTransform.Input(bytes, offset);

            System.Diagnostics.Debug.WriteLine(offset);
            //end feature affine transform

            networkStart = offset;

            int header2 = BitConverter.ToInt32(bytes, offset);

            offset += 4;
            foreach (AffineTransform at in Network)
            {
                offset = at.SetBytes(bytes, offset);
            }

            //end of file
            System.Diagnostics.Debug.WriteLine(bytes.Length);
            System.Diagnostics.Debug.WriteLine(offset);
        }
Beispiel #2
0
        /// <summary>
        /// 引数で指定したパラメーターでNNUEを初期化します
        /// </summary>
        /// <param name="featureDimensions">特徴量の数</param>
        /// <param name="networkDimensions">各レイヤーのノード数(nodeCount[0]は手番を考慮して2倍した後の数)</param>
        public NNUE(int featureDimensions, params int[] networkDimensions)
        {
            this.featureDimensions = featureDimensions;

            int length = networkDimensions.Length;

            this.networkDimensions = new int[length];
            Array.Copy(networkDimensions, this.networkDimensions, length);


            Network = new List <AffineTransform>();

            FeatureAffineTransform = new FeatureAffineTransform(this.featureDimensions, transformedFeatureDimensions);
            for (int i = 0; i < length - 1; i++)
            {
                AffineTransform at = new AffineTransform(networkDimensions[i], networkDimensions[i + 1]);
                Network.Add(at);
            }
        }
Beispiel #3
0
        /// <summary>
        /// NNUEファイルのバイト列を取得します
        ///
        /// FeatureAffineTransformプロパティやNetworkプロパティを変更している場合、その変更を反映したものを出力します。
        /// </summary>
        /// <returns></returns>
        public byte[] GetBytes()
        {
            byte[] ret = new byte[bytes.Length];
            Array.Copy(bytes, ret, bytes.Length);

            byte[] bytesFeatureTransform = FeatureAffineTransform.GetBytes();
            bytesFeatureTransform.CopyTo(ret, featureTransformStart + featureTransformHeaderSize);

            int offset = networkStart + networkHeaderSize;

            foreach (AffineTransform af in Network)
            {
                byte[] b = af.GetBytes();
                b.CopyTo(ret, offset);
                offset += b.Length;
            }

            return(ret);
        }