Enable region assignments to defer inversions

This commit is contained in:
Jack Grigg 2021-06-11 17:41:27 +01:00
parent cbd198fc71
commit 1d7060af8a
4 changed files with 24 additions and 15 deletions

View File

@ -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.

View File

@ -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);

View File

@ -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,

View File

@ -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,