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}