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