1use super::*;
2
3#[cfg(feature = "nnue_reader")]
4pub mod evaluate_nnue;
5pub mod evaluate_non_nnue;
6
7#[cfg(feature = "nnue_reader")]
8pub use evaluate_nnue::*;
9pub use evaluate_non_nnue::*;
10
11#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
12#[derive(Clone, Default, Debug)]
13pub struct Evaluator {
14 #[cfg(feature = "inbuilt_nnue")]
15 inner_evaluator: EvaluatorNNUE,
16 #[cfg(not(feature = "inbuilt_nnue"))]
17 inner_evaluator: EvaluatorNonNNUE,
18}
19
20impl Evaluator {
21 pub fn new(position: &ChessPosition) -> Self {
22 Self {
23 #[cfg(feature = "inbuilt_nnue")]
24 inner_evaluator: EvaluatorNNUE::new(position),
25 #[cfg(not(feature = "inbuilt_nnue"))]
26 inner_evaluator: EvaluatorNonNNUE::new(position),
27 }
28 }
29
30 pub fn slow_evaluate(position: &ChessPosition) -> Score {
31 #[cfg(feature = "inbuilt_nnue")]
32 {
33 EvaluatorNNUE::slow_evaluate(position)
34 }
35 #[cfg(not(feature = "inbuilt_nnue"))]
36 {
37 EvaluatorNonNNUE::slow_evaluate(position)
38 }
39 }
40}
41
42impl PositionEvaluation for Evaluator {
43 fn evaluate(&mut self, position: &ChessPosition) -> Score {
44 self.inner_evaluator.evaluate(position)
45 }
46
47 fn reset_variables(&mut self) {
48 self.inner_evaluator.reset_variables()
49 }
50
51 fn clear(&mut self) {
52 self.inner_evaluator.clear()
53 }
54
55 fn print_info(&self) {
56 self.inner_evaluator.print_info()
57 }
58
59 fn evaluate_flipped(&mut self, position: &ChessPosition) -> Score {
60 self.inner_evaluator.evaluate_flipped(position)
61 }
62
63 fn evaluate_checkmate_in(&mut self, mate_distance: Ply) -> Score {
64 self.inner_evaluator.evaluate_checkmate_in(mate_distance)
65 }
66}
67
68impl Deref for Evaluator {
69 #[cfg(feature = "inbuilt_nnue")]
70 type Target = EvaluatorNNUE;
71 #[cfg(not(feature = "inbuilt_nnue"))]
72 type Target = EvaluatorNonNNUE;
73
74 fn deref(&self) -> &Self::Target {
75 &self.inner_evaluator
76 }
77}
78
79impl DerefMut for Evaluator {
80 fn deref_mut(&mut self) -> &mut Self::Target {
81 &mut self.inner_evaluator
82 }
83}