1mod board;
53mod config;
54mod error;
55mod fast_path;
56mod geometry;
57mod image_ops;
58mod pieces;
59mod session;
60mod types;
61mod vision;
62
63pub use board::BOARD_CORNER_NAMES;
64pub use board::BoardDetection;
65pub use board::BoardDetector;
66pub use board::BoardDetectorConfig;
67pub use board::warp_board;
68pub use config::GraphOptimization;
69pub use config::ModelSource;
70pub use config::SessionConfig;
71pub use error::Result;
72pub use error::XqVisionError;
73pub use pieces::PIECE_SHORT;
74pub use pieces::PieceRecognition;
75pub use pieces::PieceRecognizer;
76pub use pieces::PieceRecognizerConfig;
77pub use pieces::PieceSnapshot;
78pub use session::ExecutionProvider;
79pub use session::ProviderFailure;
80pub use types::BoardCoord;
81pub use types::BoardCorners;
82pub use types::BoardImage;
83pub use types::CellPrediction;
84pub use types::PieceKind;
85pub use types::Point2f;
86pub use types::RecognitionResult;
87pub use types::RectF;
88pub use types::Side;
89pub use vision::XqVision;
90pub use vision::XqVisionBuilder;
91
92#[cfg(feature = "bench-support")]
93#[doc(hidden)]
94pub mod bench_support {
95 use image::RgbImage;
96
97 use crate::Result;
98 use crate::fast_path::normalize_rgb_to_chw;
99 use crate::pieces::PieceRecognition;
100 use crate::pieces::PieceRecognizer;
101 use crate::types::BOARD_CELLS;
102 use crate::types::PIECE_CLASSES;
103
104 #[must_use]
105 pub fn normalize_for_bench(image: &RgbImage) -> Vec<f32> {
106 let mut out = Vec::new();
107 normalize_rgb_to_chw(image.as_raw(), image.width() as usize, image.height() as usize, &mut out);
108 out
109 }
110
111 pub fn decode_logits_for_bench(logits: &[f32]) -> Result<PieceRecognition> {
112 PieceRecognizer::decode_logits(logits)
113 }
114
115 #[must_use]
116 pub fn zero_logits_for_bench() -> Vec<f32> { vec![0.0; BOARD_CELLS * PIECE_CLASSES] }
117}
118
119const _: fn() = || {
120 fn assert_send<T: Send>() {}
121 assert_send::<XqVision>();
122 assert_send::<BoardDetector>();
123 assert_send::<PieceRecognizer>();
124};
125
126#[cfg(test)]
127mod tests {
128 use super::*;
129
130 #[test]
131 fn public_builder_default_providers_end_with_cpu() {
132 let builder = XqVision::builder()
133 .board_model(ModelSource::memory([1_u8, 2, 3]))
134 .piece_model(ModelSource::memory([4_u8, 5, 6]));
135 let providers = builder.session_config().execution_providers();
136 assert_eq!(providers.last(), Some(&ExecutionProvider::Cpu), "Cpu must always be the final fallback provider");
137 }
138}