mirror of https://github.com/zcash/halo2.git
Enable region assignments to defer inversions
This commit is contained in:
parent
cbd198fc71
commit
1d7060af8a
|
@ -4,7 +4,7 @@ use std::{fmt, marker::PhantomData};
|
|||
|
||||
use crate::{
|
||||
arithmetic::FieldExt,
|
||||
plonk::{Advice, Any, Column, Error, Fixed, Permutation, Selector},
|
||||
plonk::{Advice, Any, Assigned, Column, Error, Fixed, Permutation, Selector},
|
||||
};
|
||||
|
||||
pub mod layouter;
|
||||
|
@ -128,7 +128,7 @@ impl<'r, F: FieldExt> Region<'r, F> {
|
|||
/// Assign an advice column value (witness).
|
||||
///
|
||||
/// Even though `to` has `FnMut` bounds, it is guaranteed to be called at most once.
|
||||
pub fn assign_advice<'v, V, A, AR>(
|
||||
pub fn assign_advice<'v, V, VR, A, AR>(
|
||||
&'v mut self,
|
||||
annotation: A,
|
||||
column: Column<Advice>,
|
||||
|
@ -136,18 +136,21 @@ impl<'r, F: FieldExt> Region<'r, F> {
|
|||
mut to: V,
|
||||
) -> Result<Cell, Error>
|
||||
where
|
||||
V: FnMut() -> Result<F, Error> + 'v,
|
||||
V: FnMut() -> Result<VR, Error> + 'v,
|
||||
VR: Into<Assigned<F>>,
|
||||
A: Fn() -> AR,
|
||||
AR: Into<String>,
|
||||
{
|
||||
self.region
|
||||
.assign_advice(&|| annotation().into(), column, offset, &mut to)
|
||||
.assign_advice(&|| annotation().into(), column, offset, &mut || {
|
||||
to().map(|v| v.into())
|
||||
})
|
||||
}
|
||||
|
||||
/// Assign a fixed value.
|
||||
///
|
||||
/// Even though `to` has `FnMut` bounds, it is guaranteed to be called at most once.
|
||||
pub fn assign_fixed<'v, V, A, AR>(
|
||||
pub fn assign_fixed<'v, V, VR, A, AR>(
|
||||
&'v mut self,
|
||||
annotation: A,
|
||||
column: Column<Fixed>,
|
||||
|
@ -155,12 +158,15 @@ impl<'r, F: FieldExt> Region<'r, F> {
|
|||
mut to: V,
|
||||
) -> Result<Cell, Error>
|
||||
where
|
||||
V: FnMut() -> Result<F, Error> + 'v,
|
||||
V: FnMut() -> Result<VR, Error> + 'v,
|
||||
VR: Into<Assigned<F>>,
|
||||
A: Fn() -> AR,
|
||||
AR: Into<String>,
|
||||
{
|
||||
self.region
|
||||
.assign_fixed(&|| annotation().into(), column, offset, &mut to)
|
||||
.assign_fixed(&|| annotation().into(), column, offset, &mut || {
|
||||
to().map(|v| v.into())
|
||||
})
|
||||
}
|
||||
|
||||
/// Constraint two cells to have the same value.
|
||||
|
|
|
@ -5,6 +5,7 @@ use std::collections::HashSet;
|
|||
use std::fmt;
|
||||
|
||||
use super::{Cell, RegionIndex};
|
||||
use crate::plonk::Assigned;
|
||||
use crate::{
|
||||
arithmetic::FieldExt,
|
||||
plonk::{Advice, Any, Column, Error, Fixed, Permutation, Selector},
|
||||
|
@ -61,7 +62,7 @@ pub trait RegionLayouter<F: FieldExt>: fmt::Debug {
|
|||
annotation: &'v (dyn Fn() -> String + 'v),
|
||||
column: Column<Advice>,
|
||||
offset: usize,
|
||||
to: &'v mut (dyn FnMut() -> Result<F, Error> + 'v),
|
||||
to: &'v mut (dyn FnMut() -> Result<Assigned<F>, Error> + 'v),
|
||||
) -> Result<Cell, Error>;
|
||||
|
||||
/// Assign a fixed value
|
||||
|
@ -70,7 +71,7 @@ pub trait RegionLayouter<F: FieldExt>: fmt::Debug {
|
|||
annotation: &'v (dyn Fn() -> String + 'v),
|
||||
column: Column<Fixed>,
|
||||
offset: usize,
|
||||
to: &'v mut (dyn FnMut() -> Result<F, Error> + 'v),
|
||||
to: &'v mut (dyn FnMut() -> Result<Assigned<F>, Error> + 'v),
|
||||
) -> Result<Cell, Error>;
|
||||
|
||||
/// Constraint two cells to have the same value.
|
||||
|
@ -138,7 +139,7 @@ impl<F: FieldExt> RegionLayouter<F> for RegionShape {
|
|||
_: &'v (dyn Fn() -> String + 'v),
|
||||
column: Column<Advice>,
|
||||
offset: usize,
|
||||
_to: &'v mut (dyn FnMut() -> Result<F, Error> + 'v),
|
||||
_to: &'v mut (dyn FnMut() -> Result<Assigned<F>, Error> + 'v),
|
||||
) -> Result<Cell, Error> {
|
||||
self.columns.insert(column.into());
|
||||
self.row_count = cmp::max(self.row_count, offset + 1);
|
||||
|
@ -155,7 +156,7 @@ impl<F: FieldExt> RegionLayouter<F> for RegionShape {
|
|||
_: &'v (dyn Fn() -> String + 'v),
|
||||
column: Column<Fixed>,
|
||||
offset: usize,
|
||||
_to: &'v mut (dyn FnMut() -> Result<F, Error> + 'v),
|
||||
_to: &'v mut (dyn FnMut() -> Result<Assigned<F>, Error> + 'v),
|
||||
) -> Result<Cell, Error> {
|
||||
self.columns.insert(column.into());
|
||||
self.row_count = cmp::max(self.row_count, offset + 1);
|
||||
|
|
|
@ -4,6 +4,7 @@ use std::fmt;
|
|||
use std::marker::PhantomData;
|
||||
|
||||
use super::{RegionLayouter, RegionShape};
|
||||
use crate::plonk::Assigned;
|
||||
use crate::{
|
||||
arithmetic::FieldExt,
|
||||
circuit::{Cell, Layouter, Region, RegionIndex, RegionStart},
|
||||
|
@ -147,7 +148,7 @@ impl<'r, 'a, F: FieldExt, CS: Assignment<F> + 'a> RegionLayouter<F>
|
|||
annotation: &'v (dyn Fn() -> String + 'v),
|
||||
column: Column<Advice>,
|
||||
offset: usize,
|
||||
to: &'v mut (dyn FnMut() -> Result<F, Error> + 'v),
|
||||
to: &'v mut (dyn FnMut() -> Result<Assigned<F>, Error> + 'v),
|
||||
) -> Result<Cell, Error> {
|
||||
self.layouter.cs.assign_advice(
|
||||
annotation,
|
||||
|
@ -168,7 +169,7 @@ impl<'r, 'a, F: FieldExt, CS: Assignment<F> + 'a> RegionLayouter<F>
|
|||
annotation: &'v (dyn Fn() -> String + 'v),
|
||||
column: Column<Fixed>,
|
||||
offset: usize,
|
||||
to: &'v mut (dyn FnMut() -> Result<F, Error> + 'v),
|
||||
to: &'v mut (dyn FnMut() -> Result<Assigned<F>, Error> + 'v),
|
||||
) -> Result<Cell, Error> {
|
||||
self.layouter.cs.assign_fixed(
|
||||
annotation,
|
||||
|
|
|
@ -2,6 +2,7 @@ use std::fmt;
|
|||
use std::marker::PhantomData;
|
||||
|
||||
use super::{RegionLayouter, RegionShape};
|
||||
use crate::plonk::Assigned;
|
||||
use crate::{
|
||||
arithmetic::FieldExt,
|
||||
circuit::{Cell, Layouter, Region, RegionIndex, RegionStart},
|
||||
|
@ -231,7 +232,7 @@ impl<'r, 'a, F: FieldExt, CS: Assignment<F> + 'a> RegionLayouter<F> for V1Region
|
|||
annotation: &'v (dyn Fn() -> String + 'v),
|
||||
column: Column<Advice>,
|
||||
offset: usize,
|
||||
to: &'v mut (dyn FnMut() -> Result<F, Error> + 'v),
|
||||
to: &'v mut (dyn FnMut() -> Result<Assigned<F>, Error> + 'v),
|
||||
) -> Result<Cell, Error> {
|
||||
self.layouter.cs.assign_advice(
|
||||
annotation,
|
||||
|
@ -252,7 +253,7 @@ impl<'r, 'a, F: FieldExt, CS: Assignment<F> + 'a> RegionLayouter<F> for V1Region
|
|||
annotation: &'v (dyn Fn() -> String + 'v),
|
||||
column: Column<Fixed>,
|
||||
offset: usize,
|
||||
to: &'v mut (dyn FnMut() -> Result<F, Error> + 'v),
|
||||
to: &'v mut (dyn FnMut() -> Result<Assigned<F>, Error> + 'v),
|
||||
) -> Result<Cell, Error> {
|
||||
self.layouter.cs.assign_fixed(
|
||||
annotation,
|
||||
|
|
Loading…
Reference in New Issue