Skip to content

Commit 7befd30

Browse files
committed
- Reworked the row-filling loops in crates/air/src/test.rs:101-152 to eliminate range indexing: both structured and unstructured trace generators now walk column iterators row-by-row, keeping per-column state where needed and breaking cleanly when the iterators exhaust. This removes the needless index loop flagged by Clippy.
Tests: `cargo clippy -p air --tests -- -Dwarnings`
1 parent eb66bee commit 7befd30

File tree

1 file changed

+59
-17
lines changed

1 file changed

+59
-17
lines changed

crates/air/src/test.rs

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,41 @@ fn generate_structured_trace<const N_COLUMNS: usize, const N_PREPROCESSED_COLUMN
105105
trace.push((0..n_rows).map(|_| rng.random()).collect::<Vec<F>>());
106106
}
107107
let mut witness_cols = vec![vec![F::ZERO]; N_COLUMNS - N_PREPROCESSED_COLUMNS];
108-
for i in 1..n_rows {
109-
for (j, witness_col) in witness_cols.iter_mut().enumerate() {
110-
let witness_cols_j_i_min_1 = witness_col[i - 1];
111-
witness_col.push(
112-
witness_cols_j_i_min_1
113-
+ F::from_usize(j + N_PREPROCESSED_COLUMNS)
114-
+ (0..N_PREPROCESSED_COLUMNS)
115-
.map(|k| trace[k][i])
116-
.product::<F>(),
117-
);
108+
let mut prev_values = vec![F::ZERO; N_COLUMNS - N_PREPROCESSED_COLUMNS];
109+
let mut column_iters = trace[..N_PREPROCESSED_COLUMNS]
110+
.iter()
111+
.map(|col| col.iter())
112+
.collect::<Vec<_>>();
113+
if column_iters.is_empty() {
114+
trace.extend(witness_cols);
115+
return trace;
116+
}
117+
for iter in &mut column_iters {
118+
iter.next(); // skip first row, already initialised
119+
}
120+
loop {
121+
let mut row_product = F::ONE;
122+
let mut progressed = true;
123+
for iter in &mut column_iters {
124+
match iter.next() {
125+
Some(value) => row_product *= *value,
126+
None => {
127+
progressed = false;
128+
break;
129+
}
130+
}
131+
}
132+
if !progressed {
133+
break;
134+
}
135+
for (j, (witness_col, prev)) in witness_cols
136+
.iter_mut()
137+
.zip(prev_values.iter_mut())
138+
.enumerate()
139+
{
140+
let next_val = *prev + F::from_usize(j + N_PREPROCESSED_COLUMNS) + row_product;
141+
witness_col.push(next_val);
142+
*prev = next_val;
118143
}
119144
}
120145
trace.extend(witness_cols);
@@ -131,14 +156,31 @@ fn generate_unstructured_trace<const N_COLUMNS: usize, const N_PREPROCESSED_COLU
131156
trace.push((0..n_rows).map(|_| rng.random()).collect::<Vec<F>>());
132157
}
133158
let mut witness_cols = vec![vec![]; N_COLUMNS - N_PREPROCESSED_COLUMNS];
134-
for i in 0..n_rows {
159+
let mut column_iters = trace[..N_PREPROCESSED_COLUMNS]
160+
.iter()
161+
.map(|col| col.iter())
162+
.collect::<Vec<_>>();
163+
if column_iters.is_empty() {
164+
trace.extend(witness_cols);
165+
return trace;
166+
}
167+
loop {
168+
let mut row_product = F::ONE;
169+
let mut progressed = true;
170+
for iter in &mut column_iters {
171+
match iter.next() {
172+
Some(value) => row_product *= *value,
173+
None => {
174+
progressed = false;
175+
break;
176+
}
177+
}
178+
}
179+
if !progressed {
180+
break;
181+
}
135182
for (j, witness_col) in witness_cols.iter_mut().enumerate() {
136-
witness_col.push(
137-
F::from_usize(j + N_PREPROCESSED_COLUMNS)
138-
+ (0..N_PREPROCESSED_COLUMNS)
139-
.map(|k| trace[k][i])
140-
.product::<F>(),
141-
);
183+
witness_col.push(F::from_usize(j + N_PREPROCESSED_COLUMNS) + row_product);
142184
}
143185
}
144186
trace.extend(witness_cols);

0 commit comments

Comments
 (0)