From 6c1c66ad63b4ab0705a1e5e40a69e365263f3669 Mon Sep 17 00:00:00 2001 From: Alan Szepieniec Date: Thu, 16 May 2024 15:52:02 +0200 Subject: [PATCH 01/12] profile: Track performance of filling degree-lowering table --- triton-vm/src/table/master_table.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/triton-vm/src/table/master_table.rs b/triton-vm/src/table/master_table.rs index 359824799..b4e831c03 100644 --- a/triton-vm/src/table/master_table.rs +++ b/triton-vm/src/table/master_table.rs @@ -844,6 +844,7 @@ impl MasterBaseTable { u32_table, ]; + profiler!(start "pad original tables"); Self::all_pad_functions() .into_par_iter() .zip_eq(base_tables.into_par_iter()) @@ -851,8 +852,11 @@ impl MasterBaseTable { .for_each(|((pad, base_table), table_length)| { pad(base_table, table_length); }); + profiler!(stop "pad original tables"); + profiler!(start "fill degree-lowering table"); DegreeLoweringTable::fill_derived_base_columns(self.trace_table_mut()); + profiler!(stop "fill degree-lowering table"); } fn all_pad_functions() -> [PadFunction; NUM_TABLES_WITHOUT_DEGREE_LOWERING] { From c65d3a9e4caf1bc1f38750d35ebe48a4e213a970 Mon Sep 17 00:00:00 2001 From: Alan Szepieniec Date: Thu, 16 May 2024 16:12:52 +0200 Subject: [PATCH 02/12] refactor: Transmit endpoints of index ranges (instead of vec of indices) --- .../src/substitution.rs | 69 ++++++++----------- 1 file changed, 27 insertions(+), 42 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index 832798936..2cfb540ac 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -118,32 +118,19 @@ impl Substitutions { let derived_section_tran_start = derived_section_cons_start + self.cons.len(); let derived_section_term_start = derived_section_tran_start + self.tran.len(); - let init_col_indices = (0..self.init.len()) - .map(|i| i + derived_section_init_start) - .collect_vec(); - let cons_col_indices = (0..self.cons.len()) - .map(|i| i + derived_section_cons_start) - .collect_vec(); - let tran_col_indices = (0..self.tran.len()) - .map(|i| i + derived_section_tran_start) - .collect_vec(); - let term_col_indices = (0..self.term.len()) - .map(|i| i + derived_section_term_start) - .collect_vec(); - let init_substitutions = Self::several_substitution_rules_to_code(&self.init); let cons_substitutions = Self::several_substitution_rules_to_code(&self.cons); let tran_substitutions = Self::several_substitution_rules_to_code(&self.tran); let term_substitutions = Self::several_substitution_rules_to_code(&self.term); let init_substitutions = - Self::base_single_row_substitutions(&init_col_indices, &init_substitutions); + Self::base_single_row_substitutions(derived_section_init_start, &init_substitutions); let cons_substitutions = - Self::base_single_row_substitutions(&cons_col_indices, &cons_substitutions); + Self::base_single_row_substitutions(derived_section_cons_start, &cons_substitutions); let tran_substitutions = - Self::base_dual_row_substitutions(&tran_col_indices, &tran_substitutions); + Self::base_dual_row_substitutions(derived_section_tran_start, &tran_substitutions); let term_substitutions = - Self::base_single_row_substitutions(&term_col_indices, &term_substitutions); + Self::base_single_row_substitutions(derived_section_term_start, &term_substitutions); quote!( #[allow(unused_variables)] @@ -163,32 +150,19 @@ impl Substitutions { let derived_section_tran_start = derived_section_cons_start + self.cons.len(); let derived_section_term_start = derived_section_tran_start + self.tran.len(); - let init_col_indices = (0..self.init.len()) - .map(|i| i + derived_section_init_start) - .collect_vec(); - let cons_col_indices = (0..self.cons.len()) - .map(|i| i + derived_section_cons_start) - .collect_vec(); - let tran_col_indices = (0..self.tran.len()) - .map(|i| i + derived_section_tran_start) - .collect_vec(); - let term_col_indices = (0..self.term.len()) - .map(|i| i + derived_section_term_start) - .collect_vec(); - let init_substitutions = Self::several_substitution_rules_to_code(&self.init); let cons_substitutions = Self::several_substitution_rules_to_code(&self.cons); let tran_substitutions = Self::several_substitution_rules_to_code(&self.tran); let term_substitutions = Self::several_substitution_rules_to_code(&self.term); let init_substitutions = - Self::ext_single_row_substitutions(&init_col_indices, &init_substitutions); + Self::ext_single_row_substitutions(derived_section_init_start, &init_substitutions); let cons_substitutions = - Self::ext_single_row_substitutions(&cons_col_indices, &cons_substitutions); + Self::ext_single_row_substitutions(derived_section_cons_start, &cons_substitutions); let tran_substitutions = - Self::ext_dual_row_substitutions(&tran_col_indices, &tran_substitutions); + Self::ext_dual_row_substitutions(derived_section_tran_start, &tran_substitutions); let term_substitutions = - Self::ext_single_row_substitutions(&term_col_indices, &term_substitutions); + Self::ext_single_row_substitutions(derived_section_term_start, &term_substitutions); quote!( #[allow(unused_variables)] @@ -241,10 +215,12 @@ impl Substitutions { } fn base_single_row_substitutions( - indices: &[usize], + section_start_index: usize, substitutions: &[TokenStream], ) -> TokenStream { - assert_eq!(indices.len(), substitutions.len()); + let indices = (0..substitutions.len()) + .map(|i| i + section_start_index) + .collect_vec(); if indices.is_empty() { return quote!(); } @@ -260,10 +236,12 @@ impl Substitutions { } fn base_dual_row_substitutions( - indices: &[usize], + section_start_index: usize, substitutions: &[TokenStream], ) -> TokenStream { - assert_eq!(indices.len(), substitutions.len()); + let indices = (0..substitutions.len()) + .map(|i| i + section_start_index) + .collect_vec(); if indices.is_empty() { return quote!(); } @@ -286,10 +264,12 @@ impl Substitutions { } fn ext_single_row_substitutions( - indices: &[usize], + section_start_index: usize, substitutions: &[TokenStream], ) -> TokenStream { - assert_eq!(indices.len(), substitutions.len()); + let indices = (0..substitutions.len()) + .map(|i| i + section_start_index) + .collect_vec(); if indices.is_empty() { return quote!(); } @@ -306,8 +286,13 @@ impl Substitutions { ) } - fn ext_dual_row_substitutions(indices: &[usize], substitutions: &[TokenStream]) -> TokenStream { - assert_eq!(indices.len(), substitutions.len()); + fn ext_dual_row_substitutions( + section_start_index: usize, + substitutions: &[TokenStream], + ) -> TokenStream { + let indices = (0..substitutions.len()) + .map(|i| i + section_start_index) + .collect_vec(); if indices.is_empty() { return quote!(); } From c290e43f301c10edcb920c873238a7f2b9030ad3 Mon Sep 17 00:00:00 2001 From: Alan Szepieniec Date: Thu, 16 May 2024 17:52:21 +0200 Subject: [PATCH 03/12] feat: Parallelize single base row substitutions --- .../src/substitution.rs | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index 2cfb540ac..e21c820f1 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -69,6 +69,9 @@ impl AllSubstitutions { use ndarray::s; use ndarray::ArrayView2; use ndarray::ArrayViewMut2; + use ndarray::Axis; + use ndarray::Zip; + use ndarray::array; use strum::Display; use strum::EnumCount; use strum::EnumIter; @@ -218,20 +221,30 @@ impl Substitutions { section_start_index: usize, substitutions: &[TokenStream], ) -> TokenStream { - let indices = (0..substitutions.len()) - .map(|i| i + section_start_index) - .collect_vec(); + let num_substitutions = substitutions.len(); + let indices = (0..num_substitutions).collect_vec(); if indices.is_empty() { return quote!(); } quote!( - master_base_table.rows_mut().into_iter().for_each(|mut row| { - #( - let (base_row, mut det_col) = - row.multi_slice_mut((s![..#indices],s![#indices..=#indices])); - det_col[0] = #substitutions; - )* - }); + let (original_part, mut current_section) = + master_base_table.multi_slice_mut( + ( + s![.., 0..#section_start_index], + s![.., #section_start_index..#section_start_index+#num_substitutions], + ) + ); + Zip::from(original_part.rows()) + .and(current_section.rows_mut()) + .par_for_each(|original_row, mut section_row| { + let mut base_row = original_row.to_owned(); + #( + let (original_row_extension, mut det_col) = + section_row.multi_slice_mut((s![..#indices],s![#indices..=#indices])); + det_col[0] = #substitutions; + base_row.append(Axis(0), array![det_col[0]].view()).unwrap(); + )* + }); ) } From 16e41d19862e37e71298e5f606588fa6f44fb379 Mon Sep 17 00:00:00 2001 From: Alan Szepieniec Date: Fri, 17 May 2024 14:35:56 +0200 Subject: [PATCH 04/12] feat: Parallelize single extension row substitutions --- .../src/substitution.rs | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index e21c820f1..4c415467e 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -241,8 +241,8 @@ impl Substitutions { #( let (original_row_extension, mut det_col) = section_row.multi_slice_mut((s![..#indices],s![#indices..=#indices])); - det_col[0] = #substitutions; - base_row.append(Axis(0), array![det_col[0]].view()).unwrap(); + det_col[0] = #substitutions; + base_row.append(Axis(0), array![det_col[0]].view()).unwrap(); )* }); ) @@ -280,22 +280,32 @@ impl Substitutions { section_start_index: usize, substitutions: &[TokenStream], ) -> TokenStream { - let indices = (0..substitutions.len()) - .map(|i| i + section_start_index) - .collect_vec(); + let num_substitutions = substitutions.len(); + let indices = (0..substitutions.len()).collect_vec(); if indices.is_empty() { return quote!(); } quote!( - for row_idx in 0..master_base_table.nrows() - 1 { - let base_row = master_base_table.row(row_idx); - let mut extension_row = master_ext_table.row_mut(row_idx); - #( - let (ext_row, mut det_col) = - extension_row.multi_slice_mut((s![..#indices],s![#indices..=#indices])); - det_col[0] = #substitutions; - )* - } + let (original_part, mut current_section) = master_ext_table.multi_slice_mut( + ( + s![.., 0..#section_start_index], + s![.., #section_start_index..#section_start_index+#num_substitutions], + ) + ); + Zip::from(master_base_table.rows()) + .and(original_part.rows()) + .and(current_section.rows_mut()) + .par_for_each( + |base_table_row, original_row, mut section_row| { + let mut extension_row = original_row.to_owned(); + #( + let (original_row_extension_row, mut det_col) = + section_row.multi_slice_mut((s![..#indices],s![#indices..=#indices])); + det_col[0] = #substitutions; + extension_row.append(Axis(0), array![det_col[0]].view()).unwrap(); + )* + } + ); ) } From ed77913fff0b3e63c016b39ee66ef159db38b1ae Mon Sep 17 00:00:00 2001 From: Alan Szepieniec Date: Fri, 17 May 2024 15:14:23 +0200 Subject: [PATCH 05/12] refactor: Avoid 1-wide array slicing operation --- constraint-evaluation-generator/src/substitution.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index 4c415467e..c85b37cf9 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -239,10 +239,9 @@ impl Substitutions { .par_for_each(|original_row, mut section_row| { let mut base_row = original_row.to_owned(); #( - let (original_row_extension, mut det_col) = - section_row.multi_slice_mut((s![..#indices],s![#indices..=#indices])); - det_col[0] = #substitutions; - base_row.append(Axis(0), array![det_col[0]].view()).unwrap(); + let det_col = section_row.get_mut(#indices).unwrap(); + *det_col = #substitutions; + base_row.append(Axis(0), array![*det_col].view()).unwrap(); )* }); ) From b5b717366042d398d7bcdaa2490cce2ab9ed9a2c Mon Sep 17 00:00:00 2001 From: Alan Szepieniec Date: Fri, 17 May 2024 17:57:56 +0200 Subject: [PATCH 06/12] perf: Parallelize base dual row substitutions --- .../src/substitution.rs | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index c85b37cf9..0a19c79ce 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -66,6 +66,7 @@ impl AllSubstitutions { //! To re-generate, execute: //! `cargo run --bin constraint-evaluation-generator` + use ndarray::Array2; use ndarray::s; use ndarray::ArrayView2; use ndarray::ArrayViewMut2; @@ -251,27 +252,39 @@ impl Substitutions { section_start_index: usize, substitutions: &[TokenStream], ) -> TokenStream { - let indices = (0..substitutions.len()) - .map(|i| i + section_start_index) - .collect_vec(); + let num_substitutions = substitutions.len(); + let indices = (0..substitutions.len()).collect_vec(); if indices.is_empty() { return quote!(); } quote!( - for curr_row_idx in 0..master_base_table.nrows() - 1 { - let next_row_idx = curr_row_idx + 1; - let (mut curr_base_row, next_base_row) = master_base_table.multi_slice_mut(( - s![curr_row_idx..=curr_row_idx, ..], - s![next_row_idx..=next_row_idx, ..], - )); - let mut curr_base_row = curr_base_row.row_mut(0); - let next_base_row = next_base_row.row(0); - #( - let (current_base_row, mut det_col) = - curr_base_row.multi_slice_mut((s![..#indices], s![#indices..=#indices])); - det_col[0] = #substitutions; - )* - } + let num_rows = master_base_table.nrows(); + let (original_part, mut current_section) = + master_base_table.multi_slice_mut( + ( + s![.., 0..#section_start_index], + s![.., #section_start_index..#section_start_index+#num_substitutions], + ) + ); + let row_indices = Array2::from_shape_vec( + [num_rows-1, 1], + (0..num_rows-1).collect::>()) + .unwrap(); + Zip::from(current_section.slice_mut(s![0..num_rows-1, ..]).rows_mut()) + .and(row_indices.rows()) + .par_for_each( |mut section_row, current_row_index_as_array| { + let current_row_index = *current_row_index_as_array.get(0).unwrap(); + let next_row_index = current_row_index + 1; + let current_base_row_slice = original_part.slice(s![current_row_index..=current_row_index, ..]); + let next_base_row_slice = original_part.slice(s![next_row_index..=next_row_index, ..]); + let mut current_base_row = current_base_row_slice.row(0).to_owned(); + let next_base_row = next_base_row_slice.row(0); + #( + let det_col = section_row.get_mut(#indices).unwrap(); + *det_col = #substitutions; + current_base_row.append(Axis(0), array![*det_col].view()).unwrap(); + )* + }); ) } From f20ff6f1b5e9f843651ab379e338d563f9b5a1bf Mon Sep 17 00:00:00 2001 From: Alan Date: Fri, 17 May 2024 22:12:23 +0200 Subject: [PATCH 07/12] perf: Parallelize dual extension row substitutions --- .../src/substitution.rs | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index 0a19c79ce..229abdb96 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -325,29 +325,38 @@ impl Substitutions { section_start_index: usize, substitutions: &[TokenStream], ) -> TokenStream { - let indices = (0..substitutions.len()) - .map(|i| i + section_start_index) - .collect_vec(); + let num_substitutions = substitutions.len(); + let indices = (0..substitutions.len()).collect_vec(); if indices.is_empty() { return quote!(); } quote!( - for curr_row_idx in 0..master_base_table.nrows() - 1 { - let next_row_idx = curr_row_idx + 1; - let current_base_row = master_base_table.row(curr_row_idx); - let next_base_row = master_base_table.row(next_row_idx); - let (mut curr_ext_row, next_ext_row) = master_ext_table.multi_slice_mut(( - s![curr_row_idx..=curr_row_idx, ..], - s![next_row_idx..=next_row_idx, ..], - )); - let mut curr_ext_row = curr_ext_row.row_mut(0); - let next_ext_row = next_ext_row.row(0); - #( - let (current_ext_row, mut det_col) = - curr_ext_row.multi_slice_mut((s![..#indices], s![#indices..=#indices])); - det_col[0] = #substitutions; - )* - } + let num_rows = master_base_table.nrows(); + let (original_part, mut current_section) = master_ext_table.multi_slice_mut( + ( + s![.., 0..#section_start_index], + s![.., #section_start_index..#section_start_index+#num_substitutions], + ) + ); + let row_indices = Array2::from_shape_vec( + [num_rows-1, 1], + (0..num_rows-1).collect::>()) + .unwrap(); + Zip::from(current_section.slice_mut(s![0..num_rows-1, ..]).rows_mut()) + .and(row_indices.rows()) + .par_for_each(|mut section_row, current_row_index_as_array| { + let current_row_index = *current_row_index_as_array.get(0).unwrap(); + let next_row_index = current_row_index + 1; + let current_base_row = master_base_table.row(current_row_index); + let next_base_row = master_base_table.row(next_row_index); + let mut current_ext_row = original_part.row(current_row_index).to_owned(); + let next_ext_row = original_part.row(next_row_index); + #( + let det_col = section_row.get_mut(#indices).unwrap(); + *det_col = #substitutions; + current_ext_row.append(Axis(0), array![*det_col].view()).unwrap(); + )* + }); ) } } From aff29a359c318fe5238f8dbfa6db3d7cd912b619 Mon Sep 17 00:00:00 2001 From: "Alan (mjolnir)" Date: Wed, 22 May 2024 11:47:58 +0200 Subject: [PATCH 08/12] style: Use array indexing instead of `get` and `unwrap` --- constraint-evaluation-generator/src/substitution.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index 229abdb96..d2bb58e67 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -240,7 +240,7 @@ impl Substitutions { .par_for_each(|original_row, mut section_row| { let mut base_row = original_row.to_owned(); #( - let det_col = section_row.get_mut(#indices).unwrap(); + let det_col = &mut section_row[#indices]; *det_col = #substitutions; base_row.append(Axis(0), array![*det_col].view()).unwrap(); )* @@ -280,7 +280,7 @@ impl Substitutions { let mut current_base_row = current_base_row_slice.row(0).to_owned(); let next_base_row = next_base_row_slice.row(0); #( - let det_col = section_row.get_mut(#indices).unwrap(); + let det_col = &mut section_row[#indices]; *det_col = #substitutions; current_base_row.append(Axis(0), array![*det_col].view()).unwrap(); )* @@ -352,7 +352,7 @@ impl Substitutions { let mut current_ext_row = original_part.row(current_row_index).to_owned(); let next_ext_row = original_part.row(next_row_index); #( - let det_col = section_row.get_mut(#indices).unwrap(); + let det_col = &mut section_row[#indices]; *det_col = #substitutions; current_ext_row.append(Axis(0), array![*det_col].view()).unwrap(); )* From f4f00b22aede303a6ae0600407a8c60470ba75b6 Mon Sep 17 00:00:00 2001 From: "Alan (mjolnir)" Date: Wed, 22 May 2024 12:34:57 +0200 Subject: [PATCH 09/12] style: Use `push` instead of `append` to concatenate single element --- .../src/substitution.rs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index d2bb58e67..ccc27ab29 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -72,7 +72,6 @@ impl AllSubstitutions { use ndarray::ArrayViewMut2; use ndarray::Axis; use ndarray::Zip; - use ndarray::array; use strum::Display; use strum::EnumCount; use strum::EnumIter; @@ -240,9 +239,8 @@ impl Substitutions { .par_for_each(|original_row, mut section_row| { let mut base_row = original_row.to_owned(); #( - let det_col = &mut section_row[#indices]; - *det_col = #substitutions; - base_row.append(Axis(0), array![*det_col].view()).unwrap(); + section_row[#indices] = #substitutions; + base_row.push(Axis(0), section_row.slice(s![#indices])).unwrap(); )* }); ) @@ -280,9 +278,8 @@ impl Substitutions { let mut current_base_row = current_base_row_slice.row(0).to_owned(); let next_base_row = next_base_row_slice.row(0); #( - let det_col = &mut section_row[#indices]; - *det_col = #substitutions; - current_base_row.append(Axis(0), array![*det_col].view()).unwrap(); + section_row[#indices] = #substitutions; + current_base_row.push(Axis(0), section_row.slice(s![#indices])).unwrap(); )* }); ) @@ -314,7 +311,7 @@ impl Substitutions { let (original_row_extension_row, mut det_col) = section_row.multi_slice_mut((s![..#indices],s![#indices..=#indices])); det_col[0] = #substitutions; - extension_row.append(Axis(0), array![det_col[0]].view()).unwrap(); + extension_row.push(Axis(0), det_col.slice(s![0])).unwrap(); )* } ); @@ -352,9 +349,8 @@ impl Substitutions { let mut current_ext_row = original_part.row(current_row_index).to_owned(); let next_ext_row = original_part.row(next_row_index); #( - let det_col = &mut section_row[#indices]; - *det_col = #substitutions; - current_ext_row.append(Axis(0), array![*det_col].view()).unwrap(); + section_row[#indices]= #substitutions; + current_ext_row.push(Axis(0), section_row.slice(s![#indices])).unwrap(); )* }); ) From 8c274763278ee3ed9c299b963ed4ae2efd8219df Mon Sep 17 00:00:00 2001 From: "Alan (mjolnir)" Date: Wed, 22 May 2024 12:41:24 +0200 Subject: [PATCH 10/12] style: Use array indexing instead of `get` and `unwrap` --- constraint-evaluation-generator/src/substitution.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index ccc27ab29..e97e636e8 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -271,7 +271,7 @@ impl Substitutions { Zip::from(current_section.slice_mut(s![0..num_rows-1, ..]).rows_mut()) .and(row_indices.rows()) .par_for_each( |mut section_row, current_row_index_as_array| { - let current_row_index = *current_row_index_as_array.get(0).unwrap(); + let current_row_index = current_row_index_as_array[0]; let next_row_index = current_row_index + 1; let current_base_row_slice = original_part.slice(s![current_row_index..=current_row_index, ..]); let next_base_row_slice = original_part.slice(s![next_row_index..=next_row_index, ..]); @@ -342,7 +342,7 @@ impl Substitutions { Zip::from(current_section.slice_mut(s![0..num_rows-1, ..]).rows_mut()) .and(row_indices.rows()) .par_for_each(|mut section_row, current_row_index_as_array| { - let current_row_index = *current_row_index_as_array.get(0).unwrap(); + let current_row_index = current_row_index_as_array[0]; let next_row_index = current_row_index + 1; let current_base_row = master_base_table.row(current_row_index); let next_base_row = master_base_table.row(next_row_index); From 373b4bbc1f39fc9e14762d5d7b255b00e02decb7 Mon Sep 17 00:00:00 2001 From: "Alan (mjolnir)" Date: Wed, 22 May 2024 13:50:06 +0200 Subject: [PATCH 11/12] refactor: Use 1d array from list of indices --- .../src/substitution.rs | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index e97e636e8..607059a08 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -66,7 +66,7 @@ impl AllSubstitutions { //! To re-generate, execute: //! `cargo run --bin constraint-evaluation-generator` - use ndarray::Array2; + use ndarray::Array1; use ndarray::s; use ndarray::ArrayView2; use ndarray::ArrayViewMut2; @@ -264,14 +264,10 @@ impl Substitutions { s![.., #section_start_index..#section_start_index+#num_substitutions], ) ); - let row_indices = Array2::from_shape_vec( - [num_rows-1, 1], - (0..num_rows-1).collect::>()) - .unwrap(); + let row_indices = Array1::from_vec(Vec::from_iter(0..num_rows - 1)); Zip::from(current_section.slice_mut(s![0..num_rows-1, ..]).rows_mut()) - .and(row_indices.rows()) - .par_for_each( |mut section_row, current_row_index_as_array| { - let current_row_index = current_row_index_as_array[0]; + .and(row_indices.view()) + .par_for_each( |mut section_row, ¤t_row_index| { let next_row_index = current_row_index + 1; let current_base_row_slice = original_part.slice(s![current_row_index..=current_row_index, ..]); let next_base_row_slice = original_part.slice(s![next_row_index..=next_row_index, ..]); @@ -335,14 +331,10 @@ impl Substitutions { s![.., #section_start_index..#section_start_index+#num_substitutions], ) ); - let row_indices = Array2::from_shape_vec( - [num_rows-1, 1], - (0..num_rows-1).collect::>()) - .unwrap(); + let row_indices = Array1::from_vec(Vec::from_iter(0..num_rows-1)); Zip::from(current_section.slice_mut(s![0..num_rows-1, ..]).rows_mut()) - .and(row_indices.rows()) - .par_for_each(|mut section_row, current_row_index_as_array| { - let current_row_index = current_row_index_as_array[0]; + .and(row_indices.view()) + .par_for_each(|mut section_row, ¤t_row_index| { let next_row_index = current_row_index + 1; let current_base_row = master_base_table.row(current_row_index); let next_base_row = master_base_table.row(next_row_index); From f617e60552bdfa5f2178d4cccbb3b566a273a80a Mon Sep 17 00:00:00 2001 From: "Alan (mjolnir)" Date: Wed, 22 May 2024 14:06:03 +0200 Subject: [PATCH 12/12] style: Use `collect` instead of `from_iter` https://rust-lang.github.io/rust-clippy/master/index.html#/from_iter_instead_of_collect --- constraint-evaluation-generator/src/substitution.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/constraint-evaluation-generator/src/substitution.rs b/constraint-evaluation-generator/src/substitution.rs index 607059a08..b7cce408b 100644 --- a/constraint-evaluation-generator/src/substitution.rs +++ b/constraint-evaluation-generator/src/substitution.rs @@ -264,7 +264,7 @@ impl Substitutions { s![.., #section_start_index..#section_start_index+#num_substitutions], ) ); - let row_indices = Array1::from_vec(Vec::from_iter(0..num_rows - 1)); + let row_indices = Array1::from_vec((0..num_rows - 1).collect::>()); Zip::from(current_section.slice_mut(s![0..num_rows-1, ..]).rows_mut()) .and(row_indices.view()) .par_for_each( |mut section_row, ¤t_row_index| { @@ -331,7 +331,7 @@ impl Substitutions { s![.., #section_start_index..#section_start_index+#num_substitutions], ) ); - let row_indices = Array1::from_vec(Vec::from_iter(0..num_rows-1)); + let row_indices = Array1::from_vec((0..num_rows - 1).collect::>()); Zip::from(current_section.slice_mut(s![0..num_rows-1, ..]).rows_mut()) .and(row_indices.view()) .par_for_each(|mut section_row, ¤t_row_index| {