#ifndef NNUE_ARCHITECTURE_H_INCLUDED
#define NNUE_ARCHITECTURE_H_INCLUDED
-// Defines the network structure
-#include "architectures/halfkp_256x2-32-32.h"
+#include "nnue_common.h"
-namespace Eval::NNUE {
+#include "features/half_kp.h"
- static_assert(kTransformedFeatureDimensions % kMaxSimdWidth == 0, "");
- static_assert(Network::kOutputDimensions == 1, "");
- static_assert(std::is_same<Network::OutputType, std::int32_t>::value, "");
+#include "layers/input_slice.h"
+#include "layers/affine_transform.h"
+#include "layers/clipped_relu.h"
+
+namespace Stockfish::Eval::NNUE {
+
+ // Input features used in evaluation function
+ using FeatureSet = Features::HalfKP;
+
+ // Number of input feature dimensions after conversion
+ constexpr IndexType TransformedFeatureDimensions = 256;
+
+ namespace Layers {
- // Trigger for full calculation instead of difference calculation
- constexpr auto kRefreshTriggers = RawFeatures::kRefreshTriggers;
+ // Define network structure
+ using InputLayer = InputSlice<TransformedFeatureDimensions * 2>;
+ using HiddenLayer1 = ClippedReLU<AffineTransform<InputLayer, 32>>;
+ using HiddenLayer2 = ClippedReLU<AffineTransform<HiddenLayer1, 32>>;
+ using OutputLayer = AffineTransform<HiddenLayer2, 1>;
+
+ } // namespace Layers
+
+ using Network = Layers::OutputLayer;
+
+ static_assert(TransformedFeatureDimensions % MaxSimdWidth == 0, "");
+ static_assert(Network::OutputDimensions == 1, "");
+ static_assert(std::is_same<Network::OutputType, std::int32_t>::value, "");
-} // namespace Eval::NNUE
+} // namespace Stockfish::Eval::NNUE
#endif // #ifndef NNUE_ARCHITECTURE_H_INCLUDED