Skip to main content

llama_cpp_bindings/model/
split_mode.rs

1use 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
12/// # Errors
13/// Returns `LlamaSplitModeParseError` if the value does not correspond to a valid `LlamaSplitMode`.
14impl 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}