Skip to content

Commit 8090b3a

Browse files
authored
Stage 1 public reference (#2567)
Depends on #2556. Pass stage 1 publics to the backend but not using them yet (TODO for future PR).
1 parent b159d9e commit 8090b3a

File tree

9 files changed

+48
-26
lines changed

9 files changed

+48
-26
lines changed

backend/src/composite/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ impl<F: FieldElement> Backend<F> for CompositeBackend<F> {
383383
.map(|(machine_name, machine_data)| {
384384
let (machine_witness, size) = witness_by_machine.get(machine_name).unwrap();
385385
let machine_data = machine_data.get(size).unwrap();
386-
let new_witness = witgen_callback.next_stage_witness(
386+
let (new_witness, _) = witgen_callback.next_stage_witness(
387387
&machine_data.pil,
388388
machine_witness,
389389
challenges.clone(),

backend/src/composite/sub_prover.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use std::{
88
};
99

1010
use crate::{Backend, Error};
11-
use powdr_executor::witgen::WitgenCallback;
11+
use powdr_executor::witgen::{Publics, WitgenCallback, Witness};
1212
use powdr_number::FieldElement;
1313

1414
/// Runs a prover until it either completes or challenges the caller, in
@@ -69,12 +69,14 @@ pub enum RunStatus<'s, F: FieldElement> {
6969
pub struct SubProver<'s, F: FieldElement> {
7070
pub thread: ScopedJoinHandle<'s, Result<Vec<u8>, Error>>,
7171
pub challenge_receiver: Receiver<BTreeMap<u64, F>>,
72-
pub response_sender: SyncSender<Vec<(String, Vec<F>)>>,
72+
pub response_sender: SyncSender<(Witness<F>, Publics<F>)>,
7373
}
7474

7575
impl<'s, F: FieldElement> SubProver<'s, F> {
7676
pub fn resume(self, response: Vec<(String, Vec<F>)>) -> RunStatus<'s, F> {
77-
self.response_sender.send(response).unwrap();
77+
self.response_sender
78+
.send((response, BTreeMap::new()))
79+
.unwrap();
7880
self.wait()
7981
}
8082

backend/src/halo2/circuit_builder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ impl<T: FieldElement, F: PrimeField<Repr = [u8; 32]>> Circuit<F> for PowdrCircui
393393
"Running witness generation for stage {stage} ({} challenges)!",
394394
challenges.len()
395395
);
396-
new_witness = self
396+
(new_witness, _) = self
397397
.witgen_callback
398398
.as_ref()
399399
.expect("Expected witgen callback!")

backend/src/mock/machine.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ impl<'a, F: FieldElement> Machine<'a, F> {
4141

4242
for stage in 1..pil.stage_count() {
4343
log::debug!("Generating stage-{stage} witness for machine {machine_name}");
44-
witness =
44+
(witness, _) =
4545
witgen_callback.next_stage_witness(pil, &witness, challenges.clone(), stage as u8);
4646
}
4747

backend/src/stwo/prover.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -411,12 +411,14 @@ where
411411
let stage1_witness_cols = witness_by_machine
412412
.iter()
413413
.map(|(machine_name, machine_witness)| {
414-
witgen_callback.next_stage_witness(
415-
&self.split[&machine_name.clone()],
416-
machine_witness,
417-
stage0_challenges.clone(),
418-
1,
419-
)
414+
witgen_callback
415+
.next_stage_witness(
416+
&self.split[&machine_name.clone()],
417+
machine_witness,
418+
stage0_challenges.clone(),
419+
1,
420+
)
421+
.0
420422
})
421423
.collect_vec();
422424

executor-utils/src/lib.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,19 @@ pub mod expression_evaluator;
1414
/// - The current witness.
1515
/// - The challenges sampled so far.
1616
pub type WitgenCallbackFn<T> = Arc<
17-
dyn Fn(&Analyzed<T>, &[(String, Vec<T>)], BTreeMap<u64, T>, u8) -> Vec<(String, Vec<T>)>
17+
dyn Fn(
18+
&Analyzed<T>,
19+
&[(String, Vec<T>)],
20+
BTreeMap<u64, T>,
21+
u8,
22+
) -> (Vec<(String, Vec<T>)>, BTreeMap<String, Option<T>>)
1823
+ Send
1924
+ Sync,
2025
>;
2126

27+
pub type Witness<T> = Vec<(String, Vec<T>)>;
28+
pub type Publics<T> = BTreeMap<String, Option<T>>;
29+
2230
#[derive(Clone)]
2331
pub struct WitgenCallback<T>(WitgenCallbackFn<T>);
2432

@@ -34,7 +42,7 @@ impl<T: FieldElement> WitgenCallback<T> {
3442
current_witness: &[(String, Vec<T>)],
3543
challenges: BTreeMap<u64, T>,
3644
stage: u8,
37-
) -> Vec<(String, Vec<T>)> {
45+
) -> (Witness<T>, Publics<T>) {
3846
(self.0)(pil, current_witness, challenges, stage)
3947
}
4048
}

executor/src/witgen/machines/second_stage_machine.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ impl<'a, T: FieldElement> Machine<'a, T> for SecondStageMachine<'a, T> {
5151
fn run<Q: QueryCallback<T>>(&mut self, mutable_state: &MutableState<'a, T, Q>) {
5252
assert!(self.data.is_empty());
5353
let first_row = self.compute_partial_first_row(mutable_state);
54-
self.data = self.process(first_row, mutable_state);
54+
(self.data, self.publics) = self.process(first_row, mutable_state);
5555
}
5656

5757
fn process_plookup<'b, Q: QueryCallback<T>>(
@@ -78,6 +78,13 @@ impl<'a, T: FieldElement> Machine<'a, T> for SecondStageMachine<'a, T> {
7878
.map(|(id, values)| (self.fixed_data.column_name(&id).to_string(), values))
7979
.collect()
8080
}
81+
82+
fn take_public_values(&mut self) -> BTreeMap<String, T> {
83+
std::mem::take(&mut self.publics)
84+
.into_iter()
85+
.map(|(key, value)| (key.to_string(), value))
86+
.collect()
87+
}
8188
}
8289

8390
impl<'a, T: FieldElement> SecondStageMachine<'a, T> {
@@ -169,7 +176,7 @@ impl<'a, T: FieldElement> SecondStageMachine<'a, T> {
169176
&mut self,
170177
first_row: Row<T>,
171178
mutable_state: &MutableState<'a, T, Q>,
172-
) -> FinalizableData<'a, T> {
179+
) -> (FinalizableData<'a, T>, BTreeMap<&'a str, T>) {
173180
log::trace!(
174181
"Running Second-Stage Machine with the following initial values in the first row:\n{}",
175182
first_row.render_values(false, &self.parts)
@@ -196,7 +203,7 @@ impl<'a, T: FieldElement> SecondStageMachine<'a, T> {
196203
// The processor might have detected a loop, in which case the degree has changed
197204
self.degree = degree;
198205

199-
updated_data.block
206+
(updated_data.block, updated_data.publics)
200207
}
201208

202209
/// At the end of the solving algorithm, we'll have computed the first row twice

executor/src/witgen/mod.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ impl<T: FieldElement> WitgenCallbackContext<T> {
111111
current_witness: &[(String, Vec<T>)],
112112
challenges: BTreeMap<u64, T>,
113113
stage: u8,
114-
) -> Vec<(String, Vec<T>)> {
114+
) -> (Witness<T>, Publics<T>) {
115115
let has_phantom_bus_sends = pil
116116
.identities
117117
.iter()
@@ -135,7 +135,10 @@ impl<T: FieldElement> WitgenCallbackContext<T> {
135135
challenges,
136136
);
137137

138-
current_witness.iter().cloned().chain(bus_columns).collect()
138+
(
139+
current_witness.iter().cloned().chain(bus_columns).collect(),
140+
BTreeMap::new(),
141+
)
139142
} else {
140143
log::debug!("Using automatic stage-1 witgen.");
141144
let size = current_witness.iter().next().unwrap().1.len() as DegreeType;
@@ -144,7 +147,6 @@ impl<T: FieldElement> WitgenCallbackContext<T> {
144147
.with_external_witness_values(current_witness)
145148
.with_challenges(stage, challenges)
146149
.generate()
147-
.0
148150
}
149151
}
150152
}

plonky3/src/circuit_builder.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -468,12 +468,13 @@ where
468468
witness_by_machine
469469
.par_iter()
470470
.map(|(machine_name, machine_witness)| {
471-
let new_witness = self.witgen_callback.as_ref().unwrap().next_stage_witness(
472-
&self.split[machine_name].0,
473-
machine_witness,
474-
challenge_map.clone(),
475-
trace_stage,
476-
);
471+
let (new_witness, _) =
472+
self.witgen_callback.as_ref().unwrap().next_stage_witness(
473+
&self.split[machine_name].0,
474+
machine_witness,
475+
challenge_map.clone(),
476+
trace_stage,
477+
);
477478
(machine_name.clone(), new_witness)
478479
})
479480
.collect()

0 commit comments

Comments
 (0)