openvm_stark_backend/prover/
error.rs1use thiserror::Error;
2
3#[derive(Error, Debug)]
5pub enum RefProverError {
6 #[error("Stacked PCS: {0}")]
7 StackedPcs(#[from] StackedPcsError),
8 #[error("Sumcheck: {0}")]
9 Sumcheck(#[from] SumcheckError),
10 #[error("LogupZerocheck: {0}")]
11 LogupZerocheck(#[from] LogupZerocheckError),
12 #[error("Stacked reduction: {0}")]
13 StackedReduction(#[from] StackedReductionError),
14 #[error("WHIR: {0}")]
15 Whir(#[from] WhirProverError),
16}
17
18#[derive(Error, Debug)]
20pub enum StackedPcsError {
21 #[error("StackedLayout::new: column height {log_height} exceeds stacked height {log_stacked_height}")]
22 LayoutHeightExceeded {
23 log_height: usize,
24 log_stacked_height: usize,
25 },
26 #[error("StackedLayout::new: row overflow at col_idx={col_idx}, expected row_idx to equal stacked height {stacked_height}")]
27 LayoutRowOverflow {
28 col_idx: usize,
29 stacked_height: usize,
30 },
31 #[error("StackedLayout::from_raw_parts: mat_idx {mat_idx} does not equal mat_starts.len() {mat_starts_len}")]
32 LayoutRawPartsMatIdx {
33 mat_idx: usize,
34 mat_starts_len: usize,
35 },
36 #[error("MerkleTree::new: matrix height must be > 0")]
37 MerkleTreeEmptyMatrix,
38 #[error("MerkleTree::new: rows_per_query ({rows_per_query}) is not a power of two")]
39 MerkleTreeRowsPerQueryNotPow2 { rows_per_query: usize },
40 #[error("MerkleTree::new: rows_per_query ({rows_per_query}) exceeds number of Merkle leaves ({num_leaves})")]
41 MerkleTreeRowsPerQueryExceeded {
42 rows_per_query: usize,
43 num_leaves: usize,
44 },
45 #[error("MerkleTree: empty digest layers (no root)")]
46 MerkleTreeNoRoot,
47 #[error("MerkleTree::query_merkle_proof: query_idx {query_idx} out of bounds for query_stride {query_stride}")]
48 MerkleTreeQueryOutOfBounds {
49 query_idx: usize,
50 query_stride: usize,
51 },
52 #[error(
53 "MerkleTree::get_opened_rows: index {index} out of bounds for query_stride {query_stride}"
54 )]
55 MerkleTreeOpenedRowsOutOfBounds { index: usize, query_stride: usize },
56 #[error("stacked_matrix: width * height overflow")]
57 StackedMatrixOverflow,
58 #[error("rs_code_matrix: checked_shl overflow for height={height}, log_blowup={log_blowup}")]
59 RsCodeShiftOverflow { height: usize, log_blowup: usize },
60}
61
62#[derive(Error, Debug)]
64pub enum SumcheckError {
65 #[error("sumcheck_multilinear: round polynomial length {len} != 1")]
66 MultilinearRoundPolyLen { len: usize },
67 #[error("sumcheck_multilinear: final evaluation count {len} != 1")]
68 MultilinearFinalEvalLen { len: usize },
69 #[error("sumcheck_prismalinear: prism_dim {prism_dim} < l_skip {l_skip}")]
70 PrismalinearDimTooSmall { prism_dim: usize, l_skip: usize },
71 #[error("sumcheck_prismalinear: round polynomial length {len} != 1")]
72 PrismalinearRoundPolyLen { len: usize },
73 #[error("sumcheck_prismalinear: r.len() {r_len} != n + 1 = {expected}")]
74 PrismalinearRLen { r_len: usize, expected: usize },
75 #[error("sumcheck_prismalinear: final evaluation count {len} != 1")]
76 PrismalinearFinalEvalLen { len: usize },
77}
78
79#[derive(Error, Debug)]
81pub enum LogupZerocheckError {
82 #[error("Stacked PCS: {0}")]
83 StackedPcs(#[from] StackedPcsError),
84 #[error("fractional_sumcheck: non-zero root sum in assert_zero mode")]
85 NonZeroRootSum,
86 #[error(
87 "LogupZerocheckCpu::new: preprocessed trace index {index} out of bounds for width {width}"
88 )]
89 PreprocessedIndexOutOfBounds { index: usize, width: usize },
90 #[error("LogupZerocheckCpu::new: main partition {part_index} col_index {col_index} >= width {width}")]
91 MainPartitionIndexOutOfBounds {
92 part_index: usize,
93 col_index: usize,
94 width: usize,
95 },
96 #[error("LogupZerocheckCpu::new: public value index {index} out of bounds for len {len}")]
97 PublicValueIndexOutOfBounds { index: usize, len: usize },
98 #[error("LogupZerocheckCpu::new: challenge not supported")]
99 ChallengeNotSupported,
100 #[error("interactions_layout.get returned None for (trace_idx={trace_idx}, interaction_idx={interaction_idx})")]
101 InteractionsLayoutMissing {
102 trace_idx: usize,
103 interaction_idx: usize,
104 },
105 #[error("sumcheck_polys_eval: eq_ns is empty at round {round}")]
106 EqNsEmpty { round: usize },
107 #[error("sumcheck_polys_eval: eq_sharp_ns is empty at round {round}")]
108 EqSharpNsEmpty { round: usize },
109 #[error("into_column_openings: mat_evals.pop() returned None")]
110 MatEvalsPopNone,
111 #[error("into_column_openings: claim.len() {len} != 1")]
112 ClaimLenNotOne { len: usize },
113 #[error("prove_zerocheck_and_logup: r.len() {r_len} != n_max + 1 = {expected}")]
114 RLenMismatch { r_len: usize, expected: usize },
115}
116
117#[derive(Error, Debug)]
119pub enum WhirProverError {
120 #[error("Stacked PCS: {0}")]
121 StackedPcs(#[from] StackedPcsError),
122 #[error("prove_whir_opening: try_into failed for sumcheck poly evals")]
123 TryIntoFailed,
124 #[error("prove_whir_opening: tree height {tree_height} != expected {expected}")]
125 TreeHeightMismatch { tree_height: usize, expected: usize },
126 #[error("prove_whir_opening: rs_tree is None in whir_round > 0")]
127 RsTreeNone,
128 #[error("prove_whir_opening: tree width {width} != 1")]
129 TreeWidthNotOne { width: usize },
130 #[error("prove_whir_opening: z_0 is None (not last round)")]
131 Z0None,
132 #[error("prove_whir_opening: final_poly is None")]
133 FinalPolyNone,
134 #[error("prove_openings: u_prisma is empty (split_first failed)")]
135 UPrismaEmpty,
136}
137
138#[derive(Error, Debug)]
140pub enum StackedReductionError {
141 #[error(
142 "batch_sumcheck_uni_round0_poly: eq_r_per_lht missing entry for log_height={log_height}"
143 )]
144 EqRMissing { log_height: usize },
145 #[error("batch_sumcheck_poly_eval: eq_r_per_lht missing entry for log_height={log_height}")]
146 EqRMissingPolyEval { log_height: usize },
147 #[error("batch_sumcheck_poly_eval: k_rot_r_per_lht missing entry for log_height={log_height}")]
148 KRotRMissing { log_height: usize },
149}