Skip to content

Commit 55afe60

Browse files
authored
Make csv export work with multiple fixed column sizes (#1744)
1 parent 7f259b4 commit 55afe60

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

number/src/serialize.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ const ROW_NAME: &str = "Row";
2929
pub fn write_polys_csv_file<T: FieldElement>(
3030
file: impl Write,
3131
render_mode: CsvRenderMode,
32-
polys: &[&(String, Vec<T>)],
32+
polys: &[(&String, &[T])],
3333
) {
3434
let mut writer = Writer::from_writer(file);
3535

3636
// Write headers, adding a "Row" column
3737
let mut headers = vec![ROW_NAME];
3838
headers.extend(polys.iter().map(|(name, _)| {
39-
assert!(name != ROW_NAME);
39+
assert!(*name != ROW_NAME);
4040
name.as_str()
4141
}));
4242
writer.write_record(&headers).unwrap();
@@ -172,7 +172,10 @@ mod tests {
172172
.into_iter()
173173
.map(|(name, values)| (name.to_string(), values))
174174
.collect::<Vec<_>>();
175-
let polys_ref = polys.iter().collect::<Vec<_>>();
175+
let polys_ref = polys
176+
.iter()
177+
.map(|(name, values)| (name, values.as_slice()))
178+
.collect::<Vec<_>>();
176179

177180
for render_mode in &[
178181
CsvRenderMode::SignedBase10,

pipeline/src/pipeline.rs

+26-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::{
22
borrow::Borrow,
3+
collections::HashMap,
34
fmt::Display,
45
fs,
56
io::{self, BufReader},
@@ -20,7 +21,7 @@ use powdr_ast::{
2021
};
2122
use powdr_backend::{Backend, BackendOptions, BackendType, Proof};
2223
use powdr_executor::{
23-
constant_evaluator::{self, get_uniquely_sized_cloned, VariablySizedColumn},
24+
constant_evaluator::{self, VariablySizedColumn},
2425
witgen::{
2526
chain_callbacks, extract_publics, unused_query_callback, QueryCallback, WitgenCallback,
2627
WitgenCallbackContext, WitnessGenerator,
@@ -549,9 +550,30 @@ impl<T: FieldElement> Pipeline<T> {
549550

550551
if self.arguments.export_witness_csv {
551552
if let Some(path) = self.path_if_should_write(|name| format!("{name}_columns.csv"))? {
552-
// TODO: Handle multiple sizes
553-
let fixed = get_uniquely_sized_cloned(fixed).unwrap();
554-
let columns = fixed.iter().chain(witness.iter()).collect::<Vec<_>>();
553+
// get the column size for each namespace. This assumes all witness columns of the same namespace have the same size.
554+
let witness_sizes: HashMap<&str, u64> = witness
555+
.iter()
556+
.map(|(name, values)| {
557+
let namespace = name.split("::").next().unwrap();
558+
(namespace, values.len() as u64)
559+
})
560+
.collect();
561+
562+
// choose the fixed column of the correct size. This assumes any namespace with no witness columns has a unique size
563+
let fixed = fixed.iter().map(|(name, columns)| {
564+
let namespace = name.split("::").next().unwrap();
565+
let columns = witness_sizes
566+
.get(&namespace)
567+
// if we have witness columns, use their size
568+
.map(|size| columns.get_by_size(*size).unwrap())
569+
// otherwise, return the unique size
570+
.unwrap_or_else(|| columns.get_uniquely_sized().unwrap());
571+
(name, columns)
572+
});
573+
574+
let columns = fixed
575+
.chain(witness.iter().map(|(name, values)| (name, values.as_ref())))
576+
.collect::<Vec<_>>();
555577

556578
let csv_file = fs::File::create(path).map_err(|e| vec![format!("{}", e)])?;
557579
write_polys_csv_file(csv_file, self.arguments.csv_render_mode, &columns);

0 commit comments

Comments
 (0)