llama_cpp_bindings/model/
split_mode.rs1use crate::model::llama_split_mode_parse_error::LlamaSplitModeParseError;
2
3#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
4pub enum LlamaSplitMode {
5 None,
6 #[default]
7 Layer,
8 Row,
9 Tensor,
10}
11
12impl TryFrom<llama_cpp_bindings_sys::llama_split_mode> for LlamaSplitMode {
15 type Error = LlamaSplitModeParseError;
16
17 fn try_from(value: llama_cpp_bindings_sys::llama_split_mode) -> Result<Self, Self::Error> {
18 match value {
19 llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_NONE => Ok(Self::None),
20 llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_LAYER => Ok(Self::Layer),
21 llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_ROW => Ok(Self::Row),
22 llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_TENSOR => Ok(Self::Tensor),
23 _ => Err(LlamaSplitModeParseError {
24 value,
25 context: format!("unknown split mode value: {value}"),
26 }),
27 }
28 }
29}
30
31impl From<LlamaSplitMode> for llama_cpp_bindings_sys::llama_split_mode {
32 fn from(value: LlamaSplitMode) -> Self {
33 match value {
34 LlamaSplitMode::None => llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_NONE,
35 LlamaSplitMode::Layer => llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_LAYER,
36 LlamaSplitMode::Row => llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_ROW,
37 LlamaSplitMode::Tensor => llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_TENSOR,
38 }
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::LlamaSplitMode;
45
46 #[test]
47 fn try_from_invalid_reports_the_value() {
48 let result = LlamaSplitMode::try_from(99);
49
50 assert!(result.is_err());
51 assert_eq!(result.unwrap_err().value, 99);
52 }
53
54 #[test]
55 fn try_from_none_roundtrip() {
56 let mode = LlamaSplitMode::try_from(llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_NONE).unwrap();
57
58 assert_eq!(mode, LlamaSplitMode::None);
59 assert_eq!(
60 llama_cpp_bindings_sys::llama_split_mode::from(mode),
61 llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_NONE
62 );
63 }
64
65 #[test]
66 fn try_from_layer_roundtrip() {
67 let mode =
68 LlamaSplitMode::try_from(llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_LAYER).unwrap();
69
70 assert_eq!(mode, LlamaSplitMode::Layer);
71 assert_eq!(
72 llama_cpp_bindings_sys::llama_split_mode::from(mode),
73 llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_LAYER
74 );
75 }
76
77 #[test]
78 fn try_from_row_roundtrip() {
79 let mode = LlamaSplitMode::try_from(llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_ROW).unwrap();
80
81 assert_eq!(mode, LlamaSplitMode::Row);
82 assert_eq!(
83 llama_cpp_bindings_sys::llama_split_mode::from(mode),
84 llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_ROW
85 );
86 }
87
88 #[test]
89 fn try_from_tensor_roundtrip() {
90 let mode =
91 LlamaSplitMode::try_from(llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_TENSOR).unwrap();
92
93 assert_eq!(mode, LlamaSplitMode::Tensor);
94 assert_eq!(
95 llama_cpp_bindings_sys::llama_split_mode::from(mode),
96 llama_cpp_bindings_sys::LLAMA_SPLIT_MODE_TENSOR
97 );
98 }
99
100 #[test]
101 fn default_is_layer() {
102 assert_eq!(LlamaSplitMode::default(), LlamaSplitMode::Layer);
103 }
104}