Skip to main content

gamlss_core/
error.rs

1use thiserror::Error;
2
3use crate::model::ParameterLayout;
4
5/// Ошибки построения и проверки GAMLSS-моделей.
6#[derive(Debug, Clone, PartialEq, Eq, Error)]
7pub enum ModelError {
8    /// Response vector пуст.
9    #[error("response vector must contain at least one observation")]
10    EmptyResponse,
11
12    /// Скалярный параметр модели имеет недопустимое значение.
13    #[error("{parameter} must be {expected}")]
14    InvalidParameter {
15        /// Имя параметра.
16        parameter: &'static str,
17        /// Ожидаемый инвариант.
18        expected: &'static str,
19    },
20
21    /// Dense matrix получила неверное число row-major значений.
22    ///
23    /// Число переданных значений `actual_values` не совпадает с `nrows * ncols`.
24    #[error("design matrix has {actual_values} values, expected {expected_values}")]
25    DesignSize {
26        /// Ожидаемое число значений.
27        expected_values: usize,
28        /// Фактическое число значений.
29        actual_values: usize,
30    },
31
32    /// Размеры design matrix не помещаются в `usize`.
33    #[error("arithmetic overflow while computing {context}")]
34    ArithmeticOverflow {
35        /// Описание вычисляемого размера.
36        context: &'static str,
37    },
38
39    /// Число строк design matrix не совпадает с длиной response.
40    #[error(
41        "{parameter} design has {actual_rows} rows, expected {expected_rows} rows from response"
42    )]
43    DesignRowMismatch {
44        /// Имя или роль проверяемого параметра.
45        parameter: &'static str,
46        /// Ожидаемое число строк.
47        expected_rows: usize,
48        /// Фактическое число строк.
49        actual_rows: usize,
50    },
51
52    /// Длина response не совпадает с ожидаемой.
53    #[error("response length is {actual}, expected {expected}")]
54    ResponseLength {
55        /// Ожидаемая длина.
56        expected: usize,
57        /// Фактическая длина.
58        actual: usize,
59    },
60
61    /// Длина observation weights не совпадает с длиной response.
62    #[error("weights length is {actual}, expected {expected}")]
63    WeightLength {
64        /// Ожидаемая длина.
65        expected: usize,
66        /// Фактическая длина.
67        actual: usize,
68    },
69
70    /// Observation weight имеет недопустимое значение.
71    #[error("weight at index {index} must be finite and >= 0")]
72    InvalidWeight {
73        /// Индекс недопустимого веса.
74        index: usize,
75    },
76
77    /// Длина beta-вектора не совпадает с числом коэффициентов модели.
78    #[error("beta length is {actual}, expected {expected}")]
79    BetaLength {
80        /// Ожидаемая длина.
81        expected: usize,
82        /// Фактическая длина.
83        actual: usize,
84    },
85
86    /// Длина gradient-вектора не совпадает с числом коэффициентов модели.
87    #[error("gradient length is {actual}, expected {expected}")]
88    GradientLength {
89        /// Ожидаемая длина.
90        expected: usize,
91        /// Фактическая длина.
92        actual: usize,
93    },
94
95    /// Индекс строки predictor-а вне диапазона наблюдений модели.
96    #[error("row index {row} is out of bounds for {nrows} rows")]
97    RowOutOfBounds {
98        /// Запрошенный индекс строки.
99        row: usize,
100        /// Число строк в модели.
101        nrows: usize,
102    },
103
104    /// Prediction blocks имеют другой coefficient layout.
105    #[error(
106        "prediction blocks have incompatible parameter layout: expected {expected:?}, got {got:?}"
107    )]
108    PredictionLayoutMismatch {
109        /// Layout training-модели.
110        expected: ParameterLayout,
111        /// Layout переданных prediction blocks.
112        got: ParameterLayout,
113    },
114
115    /// Два parameter block используют пересекающиеся диапазоны beta.
116    #[error("{first} parameter block overlaps with {second} parameter block")]
117    BlockOverlap {
118        /// Первый пересекающийся блок.
119        first: &'static str,
120        /// Второй пересекающийся блок.
121        second: &'static str,
122    },
123
124    /// Диапазон коэффициентов parameter block не помещается в `usize`.
125    #[error("{parameter} parameter block range overflows: offset {offset}, len {len}")]
126    BlockRangeOverflow {
127        /// Имя параметра.
128        parameter: &'static str,
129        /// Начальная позиция блока.
130        offset: usize,
131        /// Длина блока.
132        len: usize,
133    },
134
135    /// Модель не содержит parameter block с указанным именем.
136    ///
137    /// Возникает при попытке создать `BlockObjective` для параметра,
138    /// отсутствующего в модели.
139    #[error("model has no parameter block named {name:?}")]
140    UnknownParameter {
141        /// Имя запрошенного параметра.
142        name: &'static str,
143    },
144}