11use  std:: { 
22    borrow:: Borrow , 
3+     collections:: HashMap , 
34    fmt:: Display , 
45    fs, 
56    io:: { self ,  BufReader } , 
@@ -20,7 +21,7 @@ use powdr_ast::{
2021} ; 
2122use  powdr_backend:: { Backend ,  BackendOptions ,  BackendType ,  Proof } ; 
2223use  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